<Description>
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),用他们能称出的重量的种类数。
<Input>
n1 n2 n3 n5 n10 n20(表示各种砝码的个数)
<Output>
Total=N(N表示可以称的不同重量的个数)
<Example input>
1 1 0 0 0 0
<Example output>
Total=3
<问题分析>
对每个砝码扫描
状态转移方程:opt[j]=opt[j-w[i]]{opt[j]=opt[j-w[i]];opt[j-w[i]]=true;}
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 int w[6]={1,2,3,5,10,20}; 7 int n[6],i,j,k,total; 8 bool val[1001]; 9 memset(val,0,sizeof(bool)*1001); 10 for(i=0;i<6;i++) 11 scanf("%d",&n[i]); 12 total=0; 13 for(i=0;i<6;i++) 14 total+=w[i]*n[i]; 15 val[0]=true; 16 for(i=0;i<6;i++) 17 { 18 for(j=0;j<n[i];j++) 19 { 20 for(k=0;k<=total;k++) 21 { 22 if(val[k]) 23 val[k+w[i]]=true; 24 } 25 } 26 } 27 j=0; 28 for(i=1;i<=total;i++) 29 if(val[i]) j++; 30 printf("%d ",j); 31 while(true); 32 return 0; 33 }