[USACO14DEC]后卫马克Guard Mark

状压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");
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9386150.html