- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
剪枝:算法引入tv是当一旦当前方案的总价值的期望值也小于前面方案的总价值maxv时,继续考察当前方案变成无意义的工作,应终止当前方案,立即去考察下一个方案。因为当方案的总价值不比maxv大时,该方案不会被再考察,这同时保证函数后找到的方案一定会比前面的方案更好。 算法要点:对于第i件物品的选择 ①考虑物品i被选择,这种可能性仅当包含它不会超过方案总重量限制时才是可行的。选中后,继续递归去考虑其余物品的选择。 ②考虑物品i不被选择,这种可能性仅当不包含物品i也有可能会找到价值更大的方案的情况。 find(0,0,12) find(1,0,8) find(2,5,8) find(3,7,8) find(2,3,8) find(3,5,8) 不能得到更好的解 (不可能大于前面的7) 得到解:(1,0,1,0) maxv=7(当前最好值) 超重 不选第0种 find(1,5,12) 选第0种 选第1种 超重 选第1种 不选第1种 不选第1种 不选第2种 选第2种 选第3种 选第3种 不选第3种 不选第2种 选第2种 不选第3种 得到解:(0,1,1,1) maxv=8(当前最好值) 不能得到更好的解 (不可能大于前面的8) 不能得到更好的解 (不可能大于前面的8) 不能得到更好的解 (不可能大于前面的8) 递归调用树: //带剪枝的递归算法,使用结构体 # include stdio.h #define N 100 float limitw,totv,maxv; int option[N],cop[N]; struct { float weight; float value; } a[N]; int n; void find(int i,float tw,float tv) //考虑物品i的可能性 { int k; if (tw+a[i].weight=limitw) //选择物品i的条件 { cop[i]=1; //选择物品i if (in-1) find(i+1,tw+a[i].weight,tv); //物品i+1 else { for (k=0;kn;k++) //保留状态 option[k]=cop[k]; maxv=tv; } cop[i]=0; } if ( tv-a[i].value maxv ) //不选物品i的条件 if (in-1) find(i+1,tw,tv-a[i].value); //不选物品i else { for (k=0;kn;k++) //保留状态 option[k]=cop[k]; maxv=tv-a[i].value; } } void main( ) { int k; float w,v; printf(输入物品种数\n); scanf(%d,n); printf(输入各物品的重量和价值\n);; for (totv=0.0,k=0;kn;k++) { scanf(%f%f,w,v); a[k].weight=w; a[k].value=v; totv+=v; } printf(输入限制重量\n); scanf(%f,limitw); maxv=0.0; for (k=0;kn;k++) cop[k]=0; find(0,0.0,totv); for (k=0;kn;k++) if (option[k]) printf(%4d,k+1); printf(\n总价值为%.2f\n,maxv); } // 0-1背包问题的递归程序2,不带剪枝,使用数组 #include stdio.h #define M 10 int w[M]={5,3,2,1},v[M]={4,4,3,1}; int limit_w=7,maxv=0,n=4; void find(int i,int tw,int tv) //当前已有的重量和价值 { if (tw+w[i]=limit_w ) //选择第i件物品 if (i=n-1) //进入第i+1件的条件 find(i+1,tw+w[i],tv+v[i]); //进入第i+1件 if (i=n-1) find(i+1,tw,tv); //不选择第i件物品 if (maxvtv) maxv=tv; //保留当前的最大价值 } void main() { find(0,0,0); //从第0件物品开始选择 printf(maxv=%d\n,maxv); } 例7:青蛙过河 一条小溪尺寸不大,青蛙可以从左岸跳
文档评论(0)