- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构课程设计背包问题的求解
2009届 电子信息科学与技术专业 数据结构课程设计
PAGE
PAGE 9
背包问题的求解
摘 要 组合优化问题的求解方法研究已经成为了当前众多科学关注的焦点,这不仅在于其内在的复杂性有着重要的理论价值,同时也在于它们能在现实生活中广泛的应用。背包问题是一个典型的组合优化问题,本课程设计用递归算法求解背包问题,就是在资源有限的条件下,追求总的最大收益的资源有效分配问题。
关键词 背包问题; 递归算法;
1问题描述
1.1问题描述
背包问题:设有不同价值、不同重量的物品n件,求从这n件物品中选取一部分的方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。
1.2基本思想
(1)分别输入n件物品的重量和价值。
(2)采用递归寻找物品的方案。
(3)输出最佳的装填方案,包括选中的是哪几种物品,总价值为多少。
2问题???析
背包问题的求解是一个很经典的案例。对于它的分析与研究已经到达了一定的深度,解决这个问题有很多很多的办法。其中递归方法是比较简化程序,也比较难理解的一个。
设n件物品的重量分别为w0,w1,…,wn-1,物品的价值分别为v0,v1,…,vn-1。采用递归寻找物品的选择方案。设前面已经有了多种选择方案,并保留了其中最大的选择方案于数组option[],设方案的的总价值存于变量maxv,当前正在考察新方案其物品选择情况保存于数组cop[],嘉定当前方案已经考虑了前i-1件物品,现在正在考虑第i件物品;当前方案已经包含的物品的质量之和为tw;至此,若其余物品都选择可能的话,本方案能达到的总价值的期望值设为tv,算法引入tv是当一旦当前方案的总价值的期望值也小于前面方案的总价值maxv时,急需考察当前方案变成无意义的工作,应终止当前方案,立即去考察下一个方案。因为当方案的总价值不比maxv大时,该方案不会不会再被考察。这同时保证函数后找到的方案一定会比前面的方案更好。
对于第i件物品的选择有两种可能:
(1)物品i被选择,这种可能性仅当包含它不会超过方案总重量的限制时才是可行的。选中后,继续递归去考虑其余物品的选择;
(2)物品i不被选择,这种可能性仅当不包物品i也有可能会找大价值更大的方案的情况。
就此,通过不断地对从第一件开始的物品到第n件物品进行选择或是不选择,从而从各个方案的比较中选择出最优方案。
采用option[]和cop[]两个数组,来辅助完成递归寻找物品的选择方案。数组option[]起到一个“旗帜”作用,用来区别于未被选择的物品,从而达到输出被选择的函数。而cop[]则像是一个中间变量,它在递归过程中不断地发生变化,将有效的最终数据传输给数组option[],起到一个桥梁作用。
3数据结构描述
背包问题结构体:
struct{
int weight;
int value;
}a[N];
4算法设计
4.1程序流程图
图4-1 程序流程图
4.2算法设计
根据问题分析中的思想写出递归算法如下:
find(物品当前选择已达到的重量和tw,本方案可能达到的总价值为tv)
{
/*考虑物品i包含在当前方案中的可能性*/
if(包含物品i是可接受的)
{
将物品i包含在当前方案中;
if(in-1)
find(i+1,tw+物品i的重量,tv);
else
/*又一个完整方案,因它比前面的方案好,以它作为最佳方案*/
以当前方案作为临时最佳方案保存;
恢复物品i不包含状态;
}
/*考虑物品i不包含在当前方案中的可能性*/
if(不包含物品i仅是可考虑的)
if(in-1)
find(i+1,tw,tv-物品i的价值);
else
/*又一个完整方案,因它比前面的方案好,以它作为最佳方案*/
以当前方案作为临时最佳方案保存;
}
void find(int i,int tw,int tv)
{
int k;
if(tw+a[i].weight=limitw) /*物品i包含在当前方案的可能性*/
{
cop[i]=1;
if(in-1)
find(i+1,tw+a[i].weight,tv);
else
{
for(k=0;kn;k++)
opion[k]=cop[k];
maxv=tv;
}
cop[i]=0;
}
if(tv-a[i].valuemaxv) /*物品i不包含在当前方案的可能性*/
if(in-1)
find(i
您可能关注的文档
最近下载
- DB12_T969—2020_党政机关会议服务规范_天津市.docx VIP
- 2024-2025学年厦门一检初三英语试卷及答案.pdf VIP
- 2024-2025学年北京丰台区八年级初二(上)期末语文试卷(含答案).pdf
- 山东工商学院2024-2025学年《会计学》期末考试试卷(A卷)含参考答案.docx
- 政协提案课件稿.pptx VIP
- 《计算机图形学》练习试题及参考答案(三).doc VIP
- 步进式加热炉设计计算.pdf VIP
- 安徽大学《信号与系统》2024 - 2025 学年第一学期期末试卷.pdf VIP
- 负压称量罩方案书_130.pdf VIP
- 人教版六年级上册期末考试数学试卷(含解析)2025-2026学年浙江省杭州市西湖区.docx VIP
原创力文档


文档评论(0)