枚举,回溯,动态规划解决01背包问题课程设计.doc

枚举,回溯,动态规划解决01背包问题课程设计.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
枚举,回溯,动态规划解决01背包问题课程设计

问题描述 01背包问题: 一个商人带着一个能装m千克的背包去收购货物。现 有n种货物,且第i种货物有wi千克,可获得pi元。假设货物不能拆零,请编写算法帮助商人收购货物,获得最高利润。 算法设计与分析 枚举法分析: 设n个物品的重量和价值分别存储于数组w[ ]和v[ ]中,限制重量为tw.考虑一个n元组(x0,x1,…,xn-1),其中xi=0 表示第i个物品没有选取,而xi=1则表示第i个物品被选取。用枚举法解决背包问题,需要枚举所有的选取方案,而根据上述方法,我们只要枚举所有的n元组,就可以得到问题的解。 显然,每个分量取值为0或1的n元组的个数共为2n个。而每个n元组其实对应了一个长度为n的二进制数,且这些二进制数的取值范围为0~2n-1.因此,如果把0~2n-1分别转化为相应的二进制数,则可以得到我们所需要的2n个n元组。 回溯法分析: 先确定搜索空间:n件物品的取舍数字化,”取”标识为1,否则为0,则搜索的空间为一维数组如:(0,0,0、、、0,0),(0,0,0、、、0,1),(0,0,0、、、10)、、、(1,1,1、、、1,1)这是一颗子集树 确定约束条件:所取物品的质量和不超过m,只有取当前物品时才需要判断所取的质量和不超过m,若不取当前物品时,就无需进行判断,只要一步步进行搜索。 搜索过程中的主要操作:累加所取物品的质量,回溯是还要做现场清理,也就是将当前的物品置为不取状态,且从累加质量中减去当前物品的质量。 动态规划法: 0-1背包问题可以看作是寻找一个序列,对任一个变量 的判断是决定=1还是=0.在判断完之后,已经确定了,在判断时,会有两种情况: 背包容量不足以装入物品i,则=0,背包的价值不增加; 背包的容量可以装下物品i,则=1,背包的价值增加。 这两种情况下背包的总价值的最大者应该是对判断后的价值。 我们可以一步一步的解出我们所需要的解。第一步,只装入第一个物品,确定在各种情况下背包能得到的最大价值;第二步,只装入前两个物品,确定在各种情况下的背包能够得到的最大价值;一次类推,到了第n步就得到我们所需要的最优解了。 测试分析 枚举法 对于一个有n个元素的集合,其子集数量为,所以,不论生成子集的算法效率有多高,穷举法都会导致一个的算法。 回溯法 由于计算上界的函数需要O(n)时间,在最坏情况下有个右儿子结点需要计算上界,所以解0-1背包问题的回溯法算法所需要的计算时间为 动态规划 由于函数中有一个两重for循环,所以时间复杂度为O[(n+1)x(m+1)].空间复杂度也是O[(n+1)x(m+1)],即O(nm). 附录:源代码 枚举法 #include iostream using namespace std; #include math.h #define MAX 100 #include stdlib.h #includetime.h //将n化为二进制形式,结果存放到数组b中 void conversion(int n,int b[MAX]) { int i; for(i=0;iMAX;i++) { b[i] = n%2; n = n/2; if(n==0)break; } } void main() { long start,end; start=clock(); int i,j,n,b[MAX],temp[MAX]; float tw,maxv,w[MAX],v[MAX],temp_w,temp_v; coutplease input n: ; cinn; // 输入物品个数 coutplease input tw:; cintw; // 输入背包的限制重量 //输入各个物品的重量 coutplease input the weight : ; for(i=0;in;i++) { cinw[i]; } //输入各个物品的价值 coutplease input the value : ; for(i=0;in;i++) { cinv[i]; } maxv = 0; /*穷举2n个可能的选择,找出物品的最佳选择*/ for (i=0;ipow(2,n);i++) { for (j=0;jn;j++) { b[j] = 0; } conversion(i,b); temp_v = 0; temp_w = 0;

文档评论(0)

优秀文档 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档