01背包---每个物品最多用一次
int v[MAXN]; // 体积
int w[MAXN]; // 价值
for(int i = 1; i <= n; i++) //总个数
for(int j = 0; j <= m; j++)//总体积
{
// 当前背包容量装不进第i个物品,则价值等于前i-1个物品
if(j < v[i])
f[i][j] = f[i - 1][j];
// 能装,需进行决策是否选择第i个物品
else
f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
}
cout << f[n][m] << endl;
//优化
for (int i=1; i<=n;i++)
for (int j=m; j>=v[i];j--)
f[j]=max (f[j], f[j-v[i]]+w[i]);
完全背包---无限次
for (int i=1; i<= n; i++)//个数
for (int j=0; j<=m; j++)//体积
{
for (int k=0; k *v[i]<=j ; k++) // 无限次
f[i][j] = max (f[i][j], f[i-1][j-k*v[i]] + k *w[i]);
}
cout << f[n][m] << endl;
//优化
for (int i=1;i<= n; i++)
for (int j = v[i]; j <=m; j++)
f[j] = max(f[j], f[j-v[i]]+ w[i]);
cout << f[m];
//01背包(由于物体个数只有一个) 从后往前枚举体积
完全背包( 由于物体个数不限)从前往后枚举体积
当然这都是在优化成一维的情况下的写法 不优化空间的话怎么遍历都行
当用到i-1层时,从后面遍历,当用到第i层时,从前面遍历
多重背包
cin >> n >> m;
for (int i=1; i<=n;i++) cin >> v[i] >> w[i] >> s[i];
for (int i=1; i<=n; i++)
for (int j=0; j<=m; j++)
for (int k=0; k<=s[i] && k *v[i]<=j; k++)
f[i][j] = max(f[i][j], f[i-1][j - v[i] * k] + w[i] * k);
cout << f[n][m]<< endl;