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];
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话