一个旅行者的背包可以装12Kg物品.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一个旅行者的背包可以装12Kg物品

习题 1、一个旅行者的背包可以装12Kg物品,他可以从5件物品中选择若干件物品放在背包中,每件物品的价值和重量分别是Cj和Wj (j=1,2,……5),具体数值见下表 。他应该选择哪几件物品放在背包内,使携带的物品价值最大? 物品 1 2 3 4 5 重量/kg 3 4 3 4 6 价值/百元 12 12 9 16 30 解析: 1)背包问题的动态规划解题思路: 有件物品和一个容量为V的背包。第i件物品的是c[i],价值是 [i]。求解将哪些物品装入背包可使价值总和最大。 状态转移方程: f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的 伪码: ??for i=1.. ???for v=V..0 ????f[v]=max{f[v],f[v-c[i]]+w[i]}; 如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”, 价值为f[i-1][v]; 如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”, 此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。 重量 3 4 3 4 6 价值 12 12 9 16 30 Fmax=30; (2)物品数为两件: 物品 1,2 1,3 1,4 1,5 2,3 2,4 2,5 3,4 3,5 4,5 重量 7 6 7 9 7 8 10 7 9 10 价值 24 21 28 42 21 28 42 25 39 46 Fmax=46; (3)物品数为三件: 物品 1,2,3 1,2,4 1,2,5 1,3,4 1,3,5 1,4,5 2,3,4 重量 10 10 13 10 12 13 11 价值 33 37 0 37 51 0 37 Fmax=51; (4)物品数为四件: 物品 1,2,3,4 1,2,4,5 1,3,4,5 2,3,4,5 重量 14 17 16 17 价值 0 0 0 0 由以上可知价值最大为5100元,选择的物品为1,3,5. 程序为: program knapsack; const maxm=12; maxn=5; type ar=array[0..maxn] of integer; var m,n,j,i,t:integer; c,w:ar; f:array[0..maxm] of integer; begin readln(m,n); for i:= 1 to n do readln(w[i],c[i]); f(0):=0; for i:=1 to m do for j:=1 to n do begin if i=w[j] then t:=f[i-w[j]]+c[j]; if tf[i] then f[i]:=t end; writeln(f[m]); end 2、枚举序列x1,x2,x3,x4,x5 ,n={1,2,3,4,5}一切可能的组合,有K^n种选择,如何进行遍历。 分析:枚举的一切可能的组合,对每一可能组合,先取x1,x2,x3 这一组合,它对应于枚举树的第一层的分支,对进行分析后,保持 x1 和 x2 ,另取 x3 进行计算,在固定 x1 和x2 的前提下穷尽 x3一切可能的取值,下一步可以回朔一个层次,对一个分支直到末端计算和判别,然后回朔到上一层在对另一完整分支计算和判别,这一枚举过程可由计算机语言的多重循环来实现。 程序代码: #includestdio.h void main() {enum number {x1,x2,x3,x4,x5}; number pri; int i,j,k,n,loop; n=0; for(i=x1;i=x5;i++) for(j=x1;j=x5;j++) if(i!=j) for(k=x1;k=x2;k++) if((k!=i)(k!=j)) n=n+1; printf(%4d,n); for(loop=1;loop=3;loop++) switch(loop) {case 1:pri=number(i);break; case 2:pri=number(j);break; case 3:pri=number(k);break;

文档评论(0)

wnqwwy20 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档