数学0902班0901020216.pptVIP

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

运筹学课程设计 -------背包问题c语言解法 背包问题 问题背景:假设有一个能装入总体积为V的背包和m件体积分别为v1 , v2 , … vm的物品,能否从m件物品中挑选若干件恰好装满背包,即使v1 +v2 + … + vm=V,要求找出所有满足上述条件的解。 例如:当V=10,各件物品的体积{1,8,4,3,5,2}时,可找到下列4组解: (1,4,3,2) (1,4,5) (8,2) (3,5,2) 问题分析 首先应考虑如何选择第i件物品: (1) 考虑物品i被选择,这种可能性仅当包含它不会超过方案总重量限制时才是可行的。选中后,继续去考虑其余物品的选择。 (2) 考虑物品i不被选择,这种可能性仅当不包含物品i也有可能会找到价值更大的方案的情况。 拟用解决办法 由上面问题的提出,我觉得可利用回溯法的设计思想来解决此背包问题。即首先将物品排成一列,然后顺序选取物品装入背包,假设已选取了前i 件物品之后背包还没有装满,则继续选取第i+1件物品,若该件物品“太大”不能装入,则弃之而继续选取下一件,直至背包装满为止。但如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入背包的那件物品“不合适”,应将它取出“弃之一边”,继续再从它之后的物品中选取,如此重复,直至求得满足条件的解,或者无解。 主要算法步骤 1·输入物品总个数。 2·依次输入各物品的体积。 3·输入背包总体积。 4·将物品排成一列,按顺序选取物品装入背包中,当物品太大不能装入时则弃之继续选取下一件,直到背包装满为止。 5·出现在剩余的物品中找不到合适的物品填满背包的情况是说明刚刚装入背包的那件物品不适合,将它取出后继续选取后面的物品。 6·重复步骤4和5直至求出满足条件的解或者无解。 程序调试 1·如果在选择过程中的任何时刻,选择的数据项的总和符合目标重量,工作就完成了。 2·逐个地试每种剩余数据顶组合的可能性。但并不需要去试所有的组合,因为只要数据项的和大于目标重量的时候,就停止添加数据项。 3·如果设有组合合适的话,放弃第—个数据项,并且从第二个数据项开始再重复过程。 4·继续从第三个数据项开始,如此下去直到已经试过所有的组合。 主要代码和注释 #include stdio.h #define size 20 struct stacks //定义一个临时存储空间结构体(栈) { int data[size];//数组 int top;//作为结构体标记 }stack; void main() { int w[size];//定义数组 int V; int k=0; int i=0; int j=1; int number; int s=0; printf(\n请输入可供选择装入物品的个数:); scanf(%d,number); printf(\n请输入各件物品的体积:); for(i=0;inumber;i++){scanf(%d,w[i]);}//按次序给数组赋值 for(i=0;inumber;i++){ s=s+w[i];}//把数组每个元素加起来 printf(\n可供选择的物品的总体s=%dn,s); printf(\n请输入背包的总体积:); scanf(%d,V); if(V0||Vs){printf(\n输入背包体积错误);}//判断总体积必须大于0或小于物品总体积 printf(\n); for(i=0;inumber;i++){stack.data[i]=0;}//把结构体的data数组的每个元素初始化为0 stack.top=0;//初始化结构体标记为0 do{ while(V0k=number)//当V大于0并且k小于等于物品个数,则运行下面循环 { if(V=w[k])//每次循环判断V变量是否还大于每个元素 { stack.data[stack.top]=k; //符合条件的元素标识记录在结构体的数组中 stack.top++; V-=w[k];//每次循环就把V变量减去该次循环元素的体积数 } k++; }//循环结束 if(V==0){//当v变量只等于0时输出结果 printf(第%d个符合条件的解:,j); for(i=0;istack.top;i++) {printf(%d ,w[stack.data[i]]);} j++; printf(\n); } k=stack.data[--stack.top]; stack.data[stack.top]=0; V+=w[k]; k++; }while(!(stack.t

文档评论(0)

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

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

1亿VIP精品文档

相关文档