洛谷 P1504 积木城堡 题解

题目大意

洛谷 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;
}
posted @ 2026-01-10 21:24  CodingJuRuo  阅读(3)  评论(0)    收藏  举报