用不同的正方体积木建造 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;
}