洛谷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 }