书签 分享 收藏 举报 版权申诉 / 15
上传文档赚钱

类型《程序设计综合实践》课件_2.3.2 回溯法 - 01背包问题.pptx

  • 上传人(卖家):kld
  • 文档编号:8237771
  • 上传时间:2025-01-20
  • 格式:PPTX
  • 页数:15
  • 大小:82.55KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《《程序设计综合实践》课件_2.3.2 回溯法 - 01背包问题.pptx》由用户(kld)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    程序设计综合实践 程序设计综合实践课件_2.3.2 回溯法 01背包问题 程序设计 综合 实践 课件 _2 3.2 回溯 01 背包 问题
    资源描述:

    1、3.1 0-1背包问题1 0-1背包问题也是算法设计中的经典问题。0-1背包问题:给定一组n个物品,每种物品都有自己的重量和价值,所有物品的重量和价值都是非负的,第i个物品的重量为wi,价值为pi,背包所能承受的最大重量为W,如何选择,才能使得物品的总价值最高?问题的名称来源于如何选择最合适的若干物品放置于给定背包中,相似问题经常出现在商业、组合数学、计算复杂性理论、密码学和应用数学等领域中。任何物品都有选择或不选择两种可能,不考虑总价值最高情况下,总可选方案数为 。按照贪心法思路,将物品按单位重量价值递减次序排队,先优先选择单位重量价值高的物品,在不超出总重量的前提下,获得一种选择方案和它相

    2、应总价格,这样的方案并不能保证是最优解。2n2 我们可以用试探-回溯法解决0-1背包问题,试探每一个物品是否放入背包。为了提高算法效率,我们需要结合贪心法思想,尽量快速找出比较优的方案,这样,我们可以在试探-回溯过程中,判断出在当前选择状态下,预估背包剩余容量摆放剩余物品可能达到的最大值,如果背包里已有物品总价值加上这个预估值也无法超过现有最优方案,就放弃继续往下试探,直接回溯,减去不必要树枝,减少状态空间树的结点数,优化算法。试探完所有物品,到达状态空间树叶子结点位置时,获得一种摆放方案,如果这一方案优于原最优方案,则替换原最优方案。无论何种情况,都需要继续回溯;回溯退回到最初出发状态时,现

    3、有最优方案就是最佳方案。3主要数据结构设计:#define MaxN 500struct SGoods int iWeight;/商品重量 int iPrice;/商品价值 double dPriceRatio;/每单位重量的价值;struct SSolution int bSelectA MaxN;/选中状态 int iMaxValue;/总价值;4(待续)struct SBag int N;/物品数量 int iWeightLimit,iWeightLeft;/背包容量,剩余容量 struct SGoods sGoodsA MaxN;/物品信息 struct SSolution bestS

    4、olution,solutionNow;/最优解、目前解;5主要模块:/初始化问题,成功返回1,失败返回0int InitProbelm(struct SBag *pProblem);/打印最优解void PrintSolution(struct SBag *pProblem);/试探第i个物品选择void Try(struct SBag *pProblem,int i);/检查目前第i个皇后摆放是否okint CheckOk(struct SBag *pProblem,int i);6/初始化问题,成功返回1,失败返回0int InitProbelm(struct SBag *pProble

    5、m)int iWeightLimit;printf(“请输入背包限重(101000):n);scanf(%d,&iWeightLimit);if(iWeightLimit 1000)return 0;pProblem-iWeightLeft=pProblem-iWeightLimit=iWeightLimit;int n;printf(请输入物品数量(4500):n);scanf(%d,&n);if(n 500)return 0;7(待续)pProblem-N=n;printf(请依次输入各物品重量和价值(空格分隔):n);int i;for(i=0;i N;+i)struct SGoods

    6、goods;scanf(%d%d,&goods.iWeight,&goods.iPrice);/计算商品单位价值 goods.dPriceRatio=(double)goods.iPrice/goods.iWeight;pProblem-sGoodsA i=goods;pProblem-bestSolution.bSelectA i=pProblem-solutionNow.bSelectAi=0;pProblem-bestSolution.iMaxValue=pProblem-solutionNow.iMaxValue=0;8(待续)/按商品单位价值递减排序 qsort(pProblem-s

    7、GoodsA,pProblem-N,sizeof(struct SGoods),compare);return 1;/商品单位价值比较函数,快速排序函数qsort递减排序用int compare(const void*p1,const void*p2)const struct SGoods*pGoods1=(const struct SGoods*)p1;const struct SGoods*pGoods2=(const struct SGoods*)p2;if(pGoods1-dPriceRatio pGoods2-dPriceRatio)return-1;/商品单位价值比较高排前面 el

    8、se if(pGoods1-dPriceRatio=pGoods2-dPriceRatio)return 0;else return 1;9/打印最优解void PrintSolution(struct SBag *pProblem)int i,count=0;printf(最大总价值%d:n,pProblem-bestSolution.iMaxValue);for(i=0;i N;+i)if(pProblem-bestSolution.bSelectA i)+count;printf(No.%d,重量:%d,价值%dn,count,pProblem-sGoodsA i.iWeight,pPr

    9、oblem-sGoodsA i.iPrice);10void Try(struct SBag *pProblem,int i)/试探第i个物品选择 if(i pProblem-N)/已试探完所有物品 if(pProblem-bestSolution.iMaxValue solutionNow.iMaxValue)pProblem-bestSolution=pProblem-solutionNow;/替换成更优解 return;/继续回溯 int iSelected;for(iSelected=1;iSelected=0;-iSelected)/单位价值物品先试放 pProblem-soluti

    10、onNow.bSelectA i-1=iSelected;if(pProblem-solutionNow.bSelectA i-1)/放入时设置状态 pProblem-iWeightLeft-=pProblem-sGoodsA i-1.iWeight;pProblem-solutionNow.iMaxValue+=pProblem-sGoodsA i-1.iPrice;11(待续)if(CheckOk(pProblem,i)/本次试探是否可行 Try(pProblem,i+1);/继续试探摆放下个物品 if(pProblem-solutionNow.bSelectA i-1)/恢复不放入状态,

    11、回溯 pProblem-solutionNow.bSelectA i-1=0;pProblem-iWeightLeft+=pProblem-sGoodsA i-1.iWeight;pProblem-solutionNow.iMaxValue-=pProblem-sGoodsA i-1.iPrice;12/检查目前第i个物品摆放是否okint CheckOk(struct SBag *pProblem,int i)if(pProblem-iWeightLeft bestSolution.iMaxValue-pProblem-solutionNow.iMaxValue;/物品按单位价值递减排序 i

    12、f(i+1 N&pProblem-iWeightLeft*pProblem-sGoodsA i.dPriceRatio=iValue)return 0;/后面物品继续摆放已无法超过已有最佳方案 return 1;/ok13int main()struct SBag theProblem;if(InitProbelm(&theProblem)Try(&theProblem,1);/从第一个物品开始试探 PrintSolution(&theProblem);/打印最优解 return 0;14程序运行情况如下:请输入背包限重(101000):200请输入物品数量(4500):8请依次输入各物品重量和价值(空格分隔):79 8358 1486 5411 8528 7262 5215 4868 62最大总价值 340:No.1,重量:11,价值 85No.2,重量:15,价值 48No.3,重量:28,价值 72No.4,重量:79,价值 83No.5,重量:62,价值 5215

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:《程序设计综合实践》课件_2.3.2 回溯法 - 01背包问题.pptx
    链接地址:https://www.163wenku.com/p-8237771.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库