题目描述
有n种物品,每种物品只有一个,第i种物品的重量为 wi,价值为 vi,背包的容量为 w,物品可以分割。如何放置物品,使装入背包的物品价值之和最大?
问题分析
(1)每次选择价值最大的物品装入背包。
(2)每次选择重量最小的物品装入背包。
(3)每次选择单位重量价值最大的物品转入背包。
思考一下,如果选价值最大的物品,但重量非常大,则可能一个也装不下,分割一部分装入,价值未必是最高的;如果选重量最小的物品装入,则其价值不一定高,所以在总重量受到限制的情况下无法保证价值最大;而如果每次选单位重量价值最大的物品,则装满背包后一定能得到最大价值。
因此,我们应采用第三种贪心策略——每次从剩下的物品中选单位重量价值最大的物品。
算法设计
(1)确定合适的数据结构并初始化。首先将物品的重量、价值和单位重量价值定位为一种结构体类型,然后对物品按单位重量价值从大到小进行排序。
(2)根据贪心策略,按照单位重量价值从大到小选取物品,直到达到背包容量。如果在装入第 i 个物品时超出背包容量,则取该物品的一部分装入背包。
完美图解
物品的价值和重量如表2-3所示。如果背包容量 w = 30,怎么才能装入最大价值的物品?
物品清单
物品 i3 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
重量 w[i] | 4 | 2 | 9 | 5 | 5 | 8 | 5 | 4 | 5 | 5 |
价值 v[i] | 3 | 8 | 18 | 6 | 8 | 20 | 5 | 6 | 7 | 15 |
(1)贪心策略是每次选单位重量价值(价值/重量)大的物品,因此可以按单位重量价值对物品进行降序排列,排序后的物品清单如下所示:
排序后的物品清单
物品 i | 2 | 10 | 6 | 3 | 5 | 8 | 9 | 4 | 7 | 1 |
重量 w[i] | 2 | 5 | 8 | 9 | 5 | 4 | 5 | 5 | 5 | 4 |
价值 v[i] | 8 | 15 | 20 | 18 | 8 | 6 | 7 | 6 | 5 | 3 |
单位重量价值 | 4 | 3 | 2.5 | 2 | 1.6 | 1.5 | 1.4 | 1.2 | 1 | 0.75 |
(2)按照贪心策略,每次选择单位重量价值大的物品装入背包。
(3)构造最优解
算法详解
(1)确定合适的数据结构。
struct node {
double w; //每种物品的重量
double v; //每种物品的价值
double p; //每种物品的单位重量价值(价值/重量)
}
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
n.net/topics/618545628)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!