动态规划篇——背包问题
1.动态规划篇——记忆化搜索与递推
2.动态规划篇——背包问题
-
背包问题
-
0-1 背包
定义
0-1 背包问题的特点是物品只有取与不取两种状态,是最基础的背包问题。
例题
例题分析
分析
设
因为每一次的状态转移中,我们都只需要比当前物品数量少
但是,这个时候,对物品与对容量的遍历顺序就需要注意:因为我们能够将二维 DP 压至一维的原理是利用尚未更新的信息。所以,我们应该在外层循环遍历物品,也就是依次更新前
代码
#include <iostream> using namespace std; int dp[13000]; int w[3500], v[3500]; int main() { int N, M; cin >> N >> M; for (int i = 1; i <= N; i++)cin >> w[i] >> v[i]; for (int i = 1; i <= N; i++) { for (int j = M; j >= 1; j--) { if (j >= w[i])dp[j] = max(dp[j], dp[j - w[i]] + v[i]); } } cout << dp[M] << endl; return 0; }
-
完全背包
定义
完全背包的特点是每个物品可以无限取。
例题
例题分析
分析
因为每个物品可以无限取,所以状态转移方程应改为:
类似地,将其压为一维 DP,状态转移方程即为:
不同的是,在完全背包问题中,我们需要使用
代码
#include <iostream> using namespace std; long long dp[10000005]; long long w[10005], v[10005]; int main() { long long N, M; cin >> M >> N; for (long long i = 1; i <= N; i++)cin >> w[i] >> v[i]; for (long long i = 1; i <= N; i++) { for (long long j = 1; j <= M; j++) { if (j >= w[i])dp[j] = max(dp[j], dp[j - w[i]] + v[i]); } } cout << dp[M] << endl; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~