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