Building Block 动态规划

 

<问题分析>

把积木可搭建的最大高度看做背包的载重,每块积木的高度就是物品的重量,也就是用给定的物品装指定的包,使每个包装的物品一样多,且在符合条件的前提下尽量多。

 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\n",max[0]);
56     while(true);
57     return 0;
58 }

 

posted @ 2013-07-01 11:46  simplesslife  阅读(226)  评论(0编辑  收藏  举报