关于第一篇题解

P3052 [USACO12MAR] Cows in a Skyscraper G

@[Ja711](/user/771972) 这里贴一下我全部的代码(外加一些注释,自己的理解 ```cpp #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=1<<19; int n,w[20],v; int f[N],g[N]; //g为当前状态剩余的最大空间 //f为当前状态最少组数 void solve() { scanf("%d%d",&n,&v); for(inti=0;i<n;i++)scanf("%d",&w[i]); memset(f,0x3f,sizeof(f)); g[0]=v,f[0]=1; for(int i=0;i<1<<n;i++)//当前状态 for(int j=0;j<n;j++)//下一个放啥 if((i&(1<<j))==0) { int s=i+(1<<j);//下一个状态 if(w[j]<=g[i]&&f[s]>=f[i])//能放下 { f[s]=f[i]; g[s]=max(g[s],g[i]-w[j]); //直接取max是可以的因为f已经满足最优解,g也可以去取最优解 } if(w[j]>g[i]&&f[s]>=f[i]+1) { f[s]=f[i]+1; g[s]=max(g[s],max(g[i],v-w[j])); //g[s]=max(g[i],v-w[j]); //先放哪个物品g[s]不一样,但多循环几次结果一样 } } cout<<f[(1<<n)-1]; } int main() { solve(); return 0; } ```
by Ja711 @ 2023-03-26 21:04:18


|