bzoj 3824: [Usaco2014 Dec]Guard Mark【狀壓dp】
阿新 • • 發佈:2018-09-08
code min end mar clu i++ else bzoj namespace
設f[s]為已經從上到下疊了狀態為s的牛的最大穩定度,轉移的話枚舉沒有在集合裏並且強壯度>=當前集合牛重量和的用min(f[s],當前放進去的牛還能承受多種)來更新,高度的話直接看是否有合法集合的高度達到要求即可
#include<iostream> #include<cstdio> using namespace std; const int N=25; int n,m,h[N],w[N],a[N],f[2000005],ans=-1; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d%d",&h[i],&w[i],&a[i]); for(int i=0,len=(1<<n)-1;i<=len;i++) f[i]=-1; f[0]=1e9; for(int s=0,len=(1<<n)-1;s<=len;s++) if(f[s]!=-1) { int we=0,he=0; for(int i=1;i<=n;i++) if(s&(1<<(i-1))) we+=w[i],he+=h[i];//cerr<<s<<" "<<f[s]<<" "<<we<<" "<<he<<endl; if(he>=m) ans=max(ans,f[s]); for(int i=1;i<=n;i++) if(!(s&(1<<(i-1)))&&a[i]>=we) f[s|(1<<(i-1))]=max(f[s|(1<<(i-1))],min(f[s],a[i]-we)); } if(ans==-1) puts("Mark is too tall"); else printf("%d\n",ans); return 0; }
bzoj 3824: [Usaco2014 Dec]Guard Mark【狀壓dp】