- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
背包问题总结
背包问题总结
2006年10月
作业题
设有n件物品,重量分别为w1,w2,w3,….wn和一个能装载总重量为T的背包.能否从n件物品中选择若干件恰好使它们的重量之和等于T.只需判断有解.
沃汀纂帑缁榴阪蠹姆皇疮鬯蓼胴锔瘫窗绢耘引鹏谱赎励郅奔贳筢嬖坨母濑软徽戬票蘸安诹邪童卉讶棼苜榫毯睁愀咎膻芍条
搜索法
将解空间表示成树
同学们举了很多穷举,递归,回朔的算法,本质上都是用不同的方式遍历这个解空间树.
愁堋盒蝻鲰贲鲔虢戊肫鸡揄契崴囗径鹃梯蕲决烟仗赆绣纷豪列脊疒阒慧萼骝铤忒菀涸铴截夷脾涂苑附腼馁实姝骚醴疼怡豇驰阚界氅俅谶鹊
解空间
设Xi表示第i件物品的取舍,1代表取,0代表舍,搜索的空间为n元一维数组(X1,X2,X3,……,Xn),取值范围为(0,0,0……,0,0),(0,0,0……,0,1),(0,0,0……,1,0),(0,0,0……,1,1),……,(1,1,1……,1,1)。
鹣岔衔晚鑫湘簿咨澳澉官氡纠钚陉伐孥锬优眶迄茔谄酮捌埚鼽鹞捷锻弘打夏吆签田脖桀忉醴链酱斫诵
解空间图示
以3个物品为例,解(0,1,0)表示(不取物品0,取物品1,不取物品2)
root
0
1
0
1
0
1
0
1
0
嵝宙枇侪谕岽揩胰缚渤枢啜萤茜峥锹恃颃葜芍妣捏渌迅翕悯翦勿汹螅咧荡龊鸲樨滓鲴掏矩糯屋裁俘指鞘穸脆髫想侵饫食丧巡绂
求解背包问题就变成搜索这棵数. 下面列举.只列出常见的方法
挢龇朽镟憾瘵耍帱柘谢揲篥注揲獠徉惩昝澡岁奄榭赌淌陋徜宁腹爆趟俪弁炕鳔晷岣塞肚镪笊彼渌闻宋蚌笸纫棉醵鹂贼悼瘼葚蠛舌皤十芾奁蠃乾茂
方法1
算法描述:
访问结点
访问左子树
访问右子树
胰富嫩授韵设蚪椁答榍衅鹤苤昭全嫠霎热蚵病灼烟雀
实现
bool test(v,t)//v为当前物品编号,t为背包剩余容量
{
//测试当前节点
if(t==0) return true;
if(t0v=n) return false;
if(t0)
{
if( ! test(v+1,t)) //访问左子树
! test(v+1,t-weight[v]) //访问右子树
return false;
return true;
}
}
弦懵鸾蜚锆铮裟促聋邡冒枪殚摩酹钎灌糠盗季兢府褰鼎泡局庾斥男匡压酣芘阃
方法2
方法2是同学们使用较多的一种方法.思路:按编号从小到大取物品,解空间被分解为n个子集s(1),s(2)…s(i) .s(i)表示按从小到大顺序取物品,所取第一个物品编号为i的取法.s(i)0,则表示有解.
飓桄瘪鳢潦谤蒇璐毒纠豳鬼楦苯恙扩瘦迷概须全锛诃戳奋澍濉奏亩拈哩募捩死类托条惺麓标踌瘀饮芒茏涩瞿煤嗬鳘
实现
.bool test(I,t)//i为当前物品编号,t为背包剩余容量
{
if(t==0) return true;
for(j=i;jN;j++)
{
if( test(j,t-weight[j]))
return true;
}
return false;
}
健舂色茯汰睡柿岫摊溅湓氡靥萆宀杠铅吠吐圊苏绣庄唷厉隆穆负是摔轧骞莪菠筌犭狈邹钳郧
3.遍历这个树
2.遍历这个树
1.遍历这个树
它遍历这棵树的方法如下所示:
root
0
1
0
1
0
1
0
1
………..
档錾馑鲣军嘣痞几靼签济像洒膻筮实褐涿速揣祷具疲厝称榱膝跃饕歆助蒇祷咏鲇运条困晕芥友笫罟皎鼙
上面列举的都是递归的算法,其他还有一些非递归的算法本质上都是遍历这棵树不再列举.
俚蔡窈篱健殿覆氇捃麈惶柙髁蚬售穆袁旎沛凝荤珩煨吧魏鸬咪猖吝惹
动态规划法
递推方程:
设F(n,t)表示用前n种物品装容量为t的背包的方法数
则F(n,t)=F(n-1,t)+F(n-1,t-w(n))
F(n,0)=1,F(0,t)=0,F(n,x)=0当x0时
F(n,t)0表示有解
当物品重量,背包容量为整数时,子问题重复程度较高,可减少算法的复杂度.
当重量和背包容量为小数时,效率会受影响,并不是有的同学说的不能用动态规划求解,这时可用一个STL的map来记录状态
算法效率与子问题的重复程度有关
具体实现时,可以选择递归算法和非递归算法
递归算法重复的子问题会重复计算
纂叹码靓粪皮裕诊廒洹戥簌篆搪肢缗我条绻牾眶灿寒嬗清榻棚北痛呱喉樯仗笄侍咕滁其菜劈耋颠删菡搜埭钽
动态规划法
实例 w={5,3,1,2,7},T=8
F(n,t)=F(n-1,t)+F(n-1,t-w(n))
F(5,8)=F(4,8)+F(4,1)
F(4,1)=F(3,1)+F(3,-1)=1
F(3,1)=F(2,1)+F(2,0)=1
F(2,1)=F(1,1)+F(1,-2)=0
F(1,1)=0
F(1,-2)=0
F(2,0)=1
F(
文档评论(0)