【USACO】摩天大樓裡的奶牛Cows in a Skyscraper
阿新 • • 發佈:2018-11-08
題目
https://www.luogu.org/problemnew/show/P3052
思路
狀壓DP
用i表示狀態:奶牛是否進車廂
設f[i]為狀態為i,用最少的車箱數
設g[i]為車廂最後一節與省的容積
程式碼
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,w; int a[20],f[1<<18],g[1<<18]; int main() { scanf("%d%d",&n,&w); for(int i=1; i<=n; i++) scanf("%d",&a[i]); memset(f,63,sizeof(f)); f[0]=1; g[0]=w; for(int i=0; i<(1<<n); i++) { for(int j=1; j<=n; j++) { if(i&(1<<(j-1))) continue; if(g[i]>=a[j] && f[i|(1<<(j-1))]>=f[i]) { f[i|(1<<(j-1))]=f[i]; g[i|(1<<(j-1))]=max(g[i|(1<<(j-1))],g[i]-a[j]); } else if(g[i]<a[j] && f[i|(1<<(j-1))]>=f[i]+1) { f[i|(1<<(j-1))]=f[i]+1; g[i|(1<<(j-1))]=max(g[i|(1<<(j-1))],w-a[j]); } } } printf("%d",f[(1<<n)-1]); return 0; }