<问题分析>
把积木可搭建的最大高度看做背包的载重,每块积木的高度就是物品的重量,也就是用给定的物品装指定的包,使每个包装的物品一样多,且在符合条件的前提下尽量多。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 int cmp(const void *a,const void *b) 6 { 7 return *(int *)a-*(int *)b; 8 } 9 10 int main() 11 { 12 int n,i,j,k; 13 int val[101],max[101]; 14 bool val1[101][10001]; 15 scanf("%d",&n); 16 max[0]=0; 17 for(i=1;i<=n;i++) 18 { 19 memset(val1[i],0,sizeof(bool)*10001); 20 val1[i][0]=true;max[i]=0; 21 } 22 for(i=1;i<=n;i++) 23 { 24 val[0]=0; 25 while(scanf("%d",&j),j!=-1) 26 { 27 val[0]++; 28 val[val[0]]=j; 29 } 30 for(j=1;j<=val[0];j++) 31 { 32 max[i]+=val[j]; 33 for(k=0;k<=max[i];k++) 34 { 35 if(val1[i][k]) 36 { 37 val1[i][k+val[j]]=true; 38 } 39 40 } 41 } 42 } 43 qsort(max,n,sizeof(int),cmp); 44 for(i=1;i<=max[1];i++) 45 { 46 if(val1[1][i]) 47 { 48 printf("%d ",i); 49 for(j=1;j<=n;j++) 50 if(!val1[j][i]) break; 51 if(j>n) 52 max[0]=i; 53 } 54 } 55 printf("%d ",max[0]); 56 while(true); 57 return 0; 58 }