n<20
一道比较基础的状压DP,虽然正解是贪心
dp[S],表示选取的牛集合为S时最大载重量
然后就很简单了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn = (1<<21)+1 ;
const int INF = 2147483647;
int dp[maxn],ans=-INF;
int h[22],s[22],w[22],n,H;
int main(){
scanf("%d%d",&n,&H);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&h[i],&w[i],&s[i]);
}
int S=(1<<n)-1;
dp[0]=INF;
for(int i=1;i<=S;i++){
dp[i]=-INF;
int height=0;
for(int j=1;j<=n;j++){
if(i&(1<<(j-1))){
dp[i]=max(dp[i],min(dp[i^(1<<j-1)]-w[j],s[j]));// 当前牛塔的最大载重量,为原先最大载重减去最高层
height+=h[j]; // 牛重量,和最高层牛载重量的较小值
}
}
if(height>=H&&dp[i]>=0)ans=max(ans,dp[i]);// 判断合法,更新答案
}
if(ans<0)cout<<"Mark is too tall";
else cout<<ans;
}