- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
背包问题
1. 实验目的
给定一个载重量为 m,n 个物品,其重量为 w ,价值为 v ,1<=i<=n,
i i
要求 : 把物品装入背包,并使包内物品价值最大。
2 . 问题分析
在 0/1 背包问题中,物体或者被装入背包,或者不被装入背包,
只有两种选择。
循环变量 i ,j 意义:前 i 个物品能够装入载重量为 j 的背包中。
(n+1)*(m+1) 数组 value 意义:value[i][j] 表示前 i 个物品能装
入载重量为 j 的背包中物品的最大价值 , 若 w[i]>j ,第 i 个物品不装
入背包,
否则,若 w[i]<=j 且第 i 个物品装入背包后的价
值>value[i-1][j] ,则记录当前最大价值 (替换为第 i 个物品装入背
包后的价值)。
计算最大价值的动态规划算法如下:
// 计算
for (i=1;i<row;i++)
{
for (j=1;j<col;j++)
{
//w[i]>j, 第 i 个物品不装入背包
value[i][j]=value[i-1][j];
//w[i]<=j, 且第 i 个物品装入背包后的价值 >value[i-1][j], 则记录当前最大价值
int temp=value[i-1][j-w[i]]+v[i];
if (w[i]<=j && temp>value[i][j])
value[i][j]=temp;
}
}
即该段程序完成以下 n 个阶段:
1:只装入 1 个物品,确定在各种不同载重量的背包下,能够得到的
最大价值。
2:装入 2 个物品,确定在各种不同载重量的背包下,能够得到的最
大价值。
。。。
n:以此类推,装入 n 个物品,确定在各种不同载重量的背包下,能
够得到的最大价值。
3. 算法步骤
确定装入背包的具体物品,从 value[n][m] 向前逆推:
若 value[n][m]>value[n-1][m] ,则第 n 个物品被装入背包,且
前 n-1 个物品被装入载重量为 m-w[n] 的背包中。
否则,第 n 个物品没有装入背包, 且前 n-1 个物品被装入载重量
为 m的背包中。
以此类推, 直到确定第一个物品是否被装入背包为止。 逆推代码
如下:
//逆推求装入的物品
j=m;
for (i=row-1;i>0;i--)
{
if(value[i][j]>value[i-1][j])
{
c[i]=1;
j-=w[i];
}
}
4. 结果分析
给定一个载重量为 m ,n 个物品,其重量为 w i i
,价值为 v ,1<=i<=n ,要求 :
把物品装入背包,并使包内物品价值最大。
输入数据及输出数据均在文件中。
输入数据格式:
n m
w 1 w2 ... wn
v1 v2 ... vn
输出
文档评论(0)