状压DP。
设计状态f[i]表示奶牛的状态为i时,所有奶牛的可用耐力最小值,随便转移一下就行了。(翻译的大兄弟,没有翻译不可行的情况,wa了一次。。。)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=25;
long long n,H,f[1<<20],ans;
struct Cows{long long hig,wei,saf;}cow[N];
int main() {
scanf("%lld%lld",&n,&H);
for(int i=1;i<=n;i++) scanf("%lld%lld%lld",&cow[i].hig,&cow[i].wei,&cow[i].saf);
long long S=(1<<n)-1;
f[0]=0x3f3f3f3f;
for(long long i=1,sum;i<=S;i++) {
sum=0;
for(int j=1;j<=n;j++)
if(i&(1<<j-1)) f[i]=max(f[i],min(f[i^(1<<(j-1))]-cow[j].wei,cow[j].saf)),sum+=cow[j].hig;
if(f[i]>=0&&sum>=H) ans=max(ans,f[i]);
}
if(ans)
cout<<ans;
else
puts("Mark is too tall");
}