P1504 积木城堡 有背包的影子

题意:给出n堆木块,每一堆从大到小堆砌,是一个非绝对递减序列

     每一堆的高度就所有木块大小的总和,让我们将这n堆木块中取出一些,使n堆木块高度一样高

       求出最高的高度(只能取出,不能增加)

思路:根据题目数据,最大的高度是10000,我们就像操作01背包那样,从大到小枚举一遍,

    然后求出这n堆木块,都能到达些什么高度,用vis保存

      最后再从大到小枚举一遍,所有的堆都能到达某一高度,便是答案

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int dp[105][10010];
 4 int vis[10010];
 5 int main()
 6 {
 7     int n;
 8     scanf("%d",&n);
 9     for(int i=1;i<=n;i++){
10         int tmp;
11         dp[i][0]=1;
12         while(scanf("%d",&tmp)!=EOF){
13             if(tmp==-1) break;
14             for(int j=10010;j>=0;j--){
15                 if(dp[i][j]){
16                     dp[i][j+tmp]=1;
17                 }
18             }
19         }
20         for(int j=0;j<=10010;j++) if(dp[i][j]) vis[j]++;
21     }
22     for(int j=10010;j>=0;j--){
23         if(vis[j]==n){
24             printf("%d\n",j);
25             break;
26         }
27     }
28     return 0;
29 }
View Code

 

posted @ 2020-04-06 19:59  古比  阅读(165)  评论(0编辑  收藏  举报