01背包总结
设定:物品n个 体积m 第i个体积v[i] 价值w[i]
1.dp[i][j] 代表选到第i个 体积不超过j时 的最大价值
初始化:
二维:dp[i][j] = 0; 范围 1<=i<=n,1<=j<=m;
一维:dp[j] = 0; 范围 1<=j<=m;
状态转移方程:
不选第i个,总价值=在体积为j时选1~i-1个时的最大值;
dp[i][j] = dp[i-1][j];
选第i个, 总价值=第i个价值+在剩下的体积里选1~i-1个时的最大价值。
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);
二维:可选情况下 dp[i][j] = max(dp[i-1][j],dp[i-1][j-v[i]]+w[i])
一维:dp[j] = max(dp[j],dp[j-v[i]]+w[i]);
答案:dp[n][m] 或 dp[m] 就代表了答案
2.dp[i][j] 代表选到第i个 体积不超过j时 的方案数
初始化:
二维:dp[0][0]=1;
一维:dp[0]=1;
状态转移方程:
选:f[i][j] += f[i - 1][j - v[i]];
不选:f[i][j] = f[i - 1][j];
二维:f[i][j] += f[i - 1][j - v[i]];
一维: f[j] += f[j - v];
答案:dp[n][m]/dp[m];
3.dp[i][j] 代表选到第i个 体积至少j时 的最小价值
初始化:
二维:dp[0][0]= 0,dp[0][j]=0x3f3f3f3f(j>=1);
一维:dp[0]=0,dp[1~m]=0x3f3f3f;
状态转移方程:
二维:dp[i][j]=min(dp[i-1][j],dp[i-1][max(j-v[i],0)]+w[i])
一维:dp[j]=min(dp[j],dp[max(j-v[i],0)]+w[i])
答案:dp[n][m]/dp[m];
4.dp[i][j] 代表选到第i个 体积至少j时 的方案数
初始化 :
二维:dp[0][0]=1;
一维:dp[0]=1;
状态转移方程:
二维:dp[i][j] = dp[i - 1][j] + dp[i - 1][max(0, j - v)];
一维:dp[j] += dp[max(0, j - v)];
答案:dp[n][m]/dp[m];
5.dp[i][j] 代表选到第i个 体积恰好j时 的最大价值
初始化:
二维:dp[0][0]=0,dp[0][j]=-0x3f3f3f3f(j>=1);
一维:dp[0]=0,dp[j]=-0x3f3f3f3f(j>=1);
状态转移方程:
选:dp[i][j] = max(dp[i][j], dp[i - 1][j - v] + w);
不选:dp[i][j] = dp[i - 1][j];
二维:dp[i][j] = max(dp[i][j], dp[i - 1][j - v] + w);
一维: dp[j] = max(dp[j], dp[j - v] + w);
答案:dp[n][m]/dp[m];
6.dp[i][j] 代表选到第i个 体积恰好j时 的最小价值
初始化:
二维:dp[0][0]=0,dp[0][j]=0x3f3f3f3f(j>=1);
一维:dp[0]=0,dp[1~m]=0x3f3f3f3f;
状态转移方程:
二维:dp[i][j]=min(dp[i-1][j],dp[i-1][j-v]+w);
一维:dp[j]=min(dp[j],dp[j-v]+w);
答案:dp[n][m]/dp[m];
7.dp[i][j] 代表选到第i个 体积恰好j时 的方案数
初始化:
一维:dp[0][0]=1;
二维:dp[0]=1;
状态转移方程:
选:dp[i-1][j-v[i]];
不选:dp[i-1][j];
二维: dp[i][j]=dp[i-1][j-v[i]]+dp[i-1][j];
一维: dp[j]=dp[j]+dp[j-v[i]];
答案:dp[n][m]/dp[m];
浙公网安备 33010602011771号