背包
背包
1.二维01背包
for(int i = 1;i <= m;i++)//枚举物品数量
for(int j = w[i];j <= n;j++)//枚举背包空间
if(j >= w[i]) f[i][j] = max(f[i-1][j],f[i-1][j-w[i]]+v[i]);
ans:f[m][n]
2.一维01背包
for(int i = 1;i <= m;i++)
for(int j = n;j >= w[i];j--)
f[j] = max(f[j],f[j-w[i]]+v[i]);//f[w]代价不超过w的最大价值
ans:f[n]
3.完全背包 一维
for(int i = 1;i <= n;i++)
for(int j = w[i];j <= T;j++)//正序
f[j] = max(f[j],f[j-t[i]]+v[i])
4.多重背包
朴素:
for(i=1->n)
for(j=1->w)
for(k=1>m[i])
f[j] = max{f[j-k*w[i]]+k*v[i]}//伪代码
二进制优化:\(O(nWlogm)\)开\(logn*n\)个数组
for(int i = 1;i <= n;i++){
scanf("%d%d%d",&x,&y,&z);//价值重量数量
for(int j = 1;j <= z;j<<=1)
v[++cnt] = x*j,w[cnt] = y*j,z -= j;
if(z) v[++cnt] = x*z,w[cnt] = y*z;
}//拆分
for(int i=1;i<=cnt;i++)
for(int j=m;j>=w[i];j--)
f[j]=max(f[j],f[j-w[i]]+v[i]);//01包板子
单调队列优化:\(O(nW)\)
先咕着