洛谷 P1504 积木城堡 题解
题目大意
有 \(n\) 堆物品,每一堆物品有各自的高度,现想从每一堆物品中取走一些物品(可以不取),问让每堆的剩余物品高度和相等且最大的那个最大值为多少。
思路分析
对于取走物品,也可以认为是选出了剩下的物品。然后对于每堆,以高度为代价、不超过总高度为限制条件跑个可行性 0-1 背包即可。最后从高往低枚举高度,找到满足条件的并输出即可。
代码呈现
#include<bits/stdc++.h>
using namespace std;
const int N=105,M=10010;
int n;
int a[N][N];
bool dp[N][M];
int main(){
scanf("%d",&n);
for (int i=1;i<=n;++i){
for (int j=1;a[i][j]!=-1;) scanf("%d",&a[i][++j]);
}
int m=0;
for (int i=1;i<=n;++i){
int s=0;
for (int j=1;a[i][j]!=-1;++j) s+=a[i][j];
m=max(m,s),dp[i][0]=1;
for (int j=1;a[i][j]!=-1;++j){
for (int k=s;k>=a[i][j];--k) dp[i][k]|=dp[i][k-a[i][j]];
}
}
for (int i=m;i>=0;--i){
bool b=1;
for (int j=1;j<=n;++j){
if (!dp[j][i]){ b=0;break; }
}
if (b){ printf("%d",i);break; }
}
return 0;
}

浙公网安备 33010602011771号