vijos1059-背包计数-积木城堡

用不同的正方体积木建造 n个城堡。
要求建造的时候 下面的比上面的大。
为了让 n个城堡一样高,可以拿走他们中的积木。
问你最大高度多少
城堡累放的规则,没有什么意义啊qwq
用01背包 统计 出现每个城堡的高度的出现次数,
然后 从大到小 统计哪个 高度在n个城堡均出现。
这样比较麻烦一点,用的空间也比较大。
可以 用&操作,这样只保留 一个一维数组就行,岂不美哉。

#include <bits/stdc++.h>
using namespace std;
const int maxn=130;
int dp[maxn][10005];
int num[maxn];
int all[maxn];
int a[maxn][maxn];
int main()
{   int t,s,a1;
    scanf("%d",&t);
   int all_sum=10005;
    for(int i=0;i<t;i++){
        s=0;
        int sum=0;
        while(1){
            scanf("%d",&a1);
            if(a1==-1)break;
            a[i][s++]=a1;
            sum+=a1;
        }
        num[i]=s;
        all[i]=sum;
        all_sum=min(all[i],all_sum);
    }
    for(int i=0;i<t;i++){
            dp[i][0]=1;
        for(int j=0;j<num[i];j++){
            for(int x=all[i];x>=a[i][j];x--)
                dp[i][x]+=dp[i][x-a[i][j]];//统计数目
        }
    }
    //cout<<all_sum<<endl;
    int ss=0;
    bool flag;
    /*for(int i=0;i<t;i++){
        for(int j=0;j<=5;j++){
            printf("%d ",dp[i][j]);
        }
        cout<<endl;

    }*/
    for(int i=all_sum;i>=0;i--){
        flag=false;
        for(int j=0;j<t;j++){
            if(dp[j][i]==0)
            {flag=true;
            break;}
        }
        if(!flag)
        {ss=i;break;}
    }
    printf("%d\n",ss);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值