动态规划入门:背包问题详解与思考

4星 · 超过85%的资源 需积分: 10 15 下载量 99 浏览量 更新于2024-07-31 收藏 276KB PDF 举报
"背包问题九讲v1.1 PDF版"是一份深入浅出的动态规划教程,特别关注背包问题这一经典模型。该文档由dd_engi编写,旨在帮助读者理解和掌握动态规划,它是作者《解动态规划题的基本思考方式》系列的一部分。背包问题因其直观性和在动态规划中的核心地位,常被选作学习动态规划的入门例子。 文档内容涵盖了多种类型的背包问题,如01背包问题(每个物品只能取一次或不取)、完全背包问题(每个物品可无限次取用)、多重背包问题(每个物品有不同的限制次数)以及它们的混合形式。此外,还讨论了二维费用背包、分组背包和有依赖关系的背包问题,以及如何处理泛化物品和背包问题的不同问法变化。 阅读时,读者需要注意文档强调的思考过程的重要性,因为作者的语言风格注重深度而非易懂性,可能会包含一些需要深入思考的概念和抽象内容。作者承诺会持续维护和更新这份文档,欢迎读者提出意见、建议和错误报告,可以通过kontactr.com/user/tianyi/网站联系作者,对于OI(奥林匹克信息竞赛)方面的问题,作者也提供了解答途径。 此PDF版本首次发布于2007年7月15日,并在后续版本中吸收了作者的学习经验和新见解。对于最新的更新信息,可以通过OIBH论坛或搜索引擎搜索“背包问题九讲”获取。这是一份既实用又富有挑战性的学习资料,对于动态规划和信息学竞赛的学习者来说,具有很高的参考价值。

为以下c++代码每行加上注释:#include <iostream> #include <queue> using namespace std; struct Node { int level; //当前节点所在层 int profit; //当前节点产生的总价值 int weight; //当前节点产生的总重量 float bound; //当前节点的价值上界 bool operator<(const Node& other) const { return bound < other.bound; //按价值上界从大到小排序 } }; float bound(Node u, int n, int* w, int* p, int c) { if(u.weight>=c) //已经超重,价值上界为0 { return 0; } float bound=u.profit; int j=u.level+1; int totweight=u.weight; while ((j<n)&&(totweight+w[j]<=c)) { totweight+=w[j]; //选第j件物品 bound+=p[j]; j++; } if (j<n) { bound+=(c - totweight)p[j]/w[j]; // 加上部分物品的价值 } return bound; } int knapsack(int n, int w, int* p, int c) { priority_queue<Node> Q; Node u, v; u.level = -1; u.profit = 0; u.weight = 0; u.bound = bound(u, n, w, p, c); int maxprofit = 0; Q.push(u); while (!Q.empty()) { u = Q.top(); Q.pop(); if (u.bound > maxprofit) { v.level = u.level + 1; v.weight = u.weight + w[v.level]; v.profit = u.profit + p[v.level]; if (v.weight <= c && v.profit > maxprofit) { maxprofit = v.profit; // 更新最大价值 } v.bound=bound(v,n,w,p,c); if (v.bound > maxprofit) { Q.push(v); // 左儿子节点入队 } v.weight=u.weight; v.profit=u.profit; v.bound=bound(v,n,w,p,c); if (v.bound > maxprofit) { Q.push(v); // 右儿子节点入队 } } } return maxprofit; } int main() { int n = 5; // 物品数量 int w[] = {2, 2, 6, 5, 4}; // 物品重量数组 int p[] = {6, 3, 5, 4, 6}; // 物品价值数组 int c = 10; // 背包容量 cout << "最大价值为:" << knapsack(n, w, p, c) << endl; return 0; }

2023-05-16 上传