洛谷P2347 砝码称重

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxv=1000;
 4 int v[7]={0,1,2,3,5,10,20},w[1005],num[7],tot,f[1005],ans;
 5 int main()
 6 {
 7     scanf("%d%d%d%d%d%d",&num[1],&num[2],&num[3],&num[4],&num[5],&num[6]);
 8     for(int i=1;i<=6;++i)
 9     {
10         int j;for(j=1;num[i]>=j;num[i]-=j,j<<=1) w[++tot]=j*v[i];//多重背包二进制拆分 
11         if(num[i]) w[++tot]=num[i]*v[i];
12     }
13     f[0]=1;
14     for(int i=1;i<=tot;++i)
15         for(int j=maxv;j>=w[i];--j)
16             f[j]+=f[j-w[i]];
17     for(int i=1;i<=maxv;++i) if(f[i]) ++ans;//恰装满 扫描答案 
18     printf("Total=%d",ans);
19     return 0;
20 } 
原文地址:https://www.cnblogs.com/yu-xing/p/10316238.html