- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
背包问题-第一课堂
背包问题
(knapsack problem)
一、背包问题(pack.pas)
【题目】某商店有N类物品,第i类物品价值为Vi,重量为Wi,背包最大能承受的重量为G。其中Vi和Wi和G都为非负整数。目标是如何选择装入背包的物品,使装入背包的物品总价值最大。每类物品可选任意数量放入背包。可将这个问题形式描述如下:
求
约束条件为
,
其中Xi是:该类物品装入背包的个数与该类物品总个数的比值,Xi=0表示没有第i种物品放到背包中;Xi=1表示将第i种物品全部放到背包中。
【输入】第一行为分别为G,N,第二行分别为N类物品的重量,第三行分别为N类物品的价值。
【输出】最大总价值。
【输入样例】pack.in
100 5
30 10 20 50 40
65 20 30 60 40
【输出样例】pack.out
163
【算法分析】贪心算法。
样例分析:
i 1 2 3 4 5 Wi 30 10 20 50 40 Vi 65 20 30 60 40 Vi/ Wi 2.1 2 1.5 1.2 1 有4个可行解如下图所示:
(X1,X2,X3,X4,X5) ① (1,1,1/2,3/5,1/4) 90 146 ② (1,1,1/2,1,0) 100 160 ③ (1,1,1,0,1) 100 155 ④ (1,1,1,4/5,0) 100 163 4个可行解中,第4个可行解的总价值最大。
解法②贪心策略:按价值递减的顺序依次选择物品;
(虽然每一步获得了价值最大的增加,但是背包可用重量消耗过快);
解法③贪心策略:按重量递增的顺序依次选择物品;
(重量虽然慢慢地消耗,但是价值没能迅速地增加)
启发:我们应该采用在价值的增长速率和重量的消耗速度之间取得平衡的选择标准!
解法④贪心策略:按(Vi/ Wi)递减的顺序依次选择物品
(即每一次装入的物品应该使它占用的每一单位重量获得最大的单位价值,可以证明用该策略得到的是最优解)。
【算法描述】
knapsack(v,w,g,x,n) //事先对w进行按单价排序
x←0 // 初始化解
c←g // c:背包剩余可用容量
for i←1 to n do
if w(i)≤c // 当前考虑物品的重量小于背包现能承受重量
then x(i) ←1 // 物品放入
c←c-w(i) // 更新背包现能承受重量
else
break
if in
then x(i) ←c/w(i) // 将物品一部分放入背包
return x // 返回背包问题的解
二、0/1背包问题(pack01.pas)
【题目描述】某商店有N项物品,第i个物品价值为Vi,重量为Wi,背包最大能承受的重量为G。其中Vi和Wi和G都为正整数。目标是如何选择装入背包的物品,使装入背包的物品总价值最大。要求每项物品要么不选,要么全选放入背包。可将这个问题形式描述如下:
求
约束条件为
,
其中Xi是该类物品装入背包的个数,它的取值只能为0或1,这是因为每项物品要么不选,要么全选放入背包。
【输入】第一行为分别为G,N,第二行分别为N个物品的重量,第三行分别为N个物品的价值。
【输出】最大总价值
【输入样例】pack01.in
9 4
2 3 4 5
3 4 5 7
【输出样例】pack01.out
12
【算法分析】设U={u1,u2,…,un}是一个准备放入背包的N项物品集合。为了装满背包,我们得到一个递推公式如下,设V[i][j]表示从前i项{u1,u2,…,ui}中取出来装入体积为j的背包的物品的最大价值。这里,i的取值范围是从0到N,j的取值范围是从0到G,这样,要寻求的是值V[N][G]。显然,
V[0][j]对于所有j的值是0,这是由于背包中什么也没有;
V[i][0]对于所有i的值是0,这是由于没有东西可以放到最大承受重量为0的背包中。
一般情况下,当i和j都大于0时,有下面结论:
V[i][j]是下面两个量的最大值——
V[i-1][j]:仅用最优的方法取自{u1,u2,…,ui-1}的物品去装入能承受重量为j的背包所得到的价值最大值。
V[i-1][j-wi]+vi :用最优的方法取自{u1,u2,…,ui-1}的物品去装入能承受重量为j- wi的背包所得到的价值最大值加上物品ui的价值。这仅应用于如果j≥wi以及它等于把物品ui加到背包上的情况。
观察结论对于找出最优装背包时的值,蕴含下面递推式:
0
文档评论(0)