洛谷P2725 邮票 Stamps

点击跳转了解题意

题解:看了第一眼以为搜一下就能过,结果写了个爆搜穷举所有邮票加法的排列,果不其然挂了就47。

再仔细一看,其实看了标签这很像多重背包枚举件数,果不其然又错了,最后才发现是个完全背包,

(其实看了题解)状态记下能凑成的数,就是包的大小,最大的包可以用数据范围算出来,然后值记录

的是能凑出这个值用的邮票数,每次更新的是如果能用更小的邮票数凑出这个数,显然更优。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 int k,n,num,dp[2000005];
 9 
10 int main()
11 {
12     scanf("%d%d",&k,&n);
13     for(int i=1;i<=2000000;i++)
14         dp[i]=2333;
15     dp[0]=0;
16     for(int i=1;i<=n;i++)
17     {
18         scanf("%d",&num);
19         for(int v=num;v<=2000000;v++)
20             if(dp[v-num]+1<=k)
21                dp[v]=min(dp[v],dp[v-num]+1);
22     }
23     for(int i=1;i<=2000000;i++)
24         if(dp[i]==2333)
25         {
26             printf("%d",i-1);
27             return 0;
28         }
29     return 0;
30 } 
原文地址:https://www.cnblogs.com/Hoyoak/p/11379043.html