@[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