算法设计背包问题用动态规划的递归实现与非递归实现_第1页
算法设计背包问题用动态规划的递归实现与非递归实现_第2页
算法设计背包问题用动态规划的递归实现与非递归实现_第3页
算法设计背包问题用动态规划的递归实现与非递归实现_第4页
算法设计背包问题用动态规划的递归实现与非递归实现_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华南农业大学算法分析与设计课程实验专业年级:10信息与计算科学2班学生学号:22号学生姓名:梁高鼎实验题目:用动态规划法求解0-1背包问题指导老师: 梁 茹 冰实验时间: 012年11月5日一、实验内容用动态规划法求解0-1背包问题 要求:(1)用递归实现(备忘录方法)(2)用非递归实现(动态规划法)二、实验步骤2.1、理解算法思想和问题要求;2.2、写出每个操作的算法2.2.1递归实现(备忘录方法)void find(int i,float tw,float tv)int k;物品i包含在当前方案的可能性if(tw+ai.weight <= limitw)copi=l;if(i<

2、n-l)find(i+1 ,tw+ai .weight,tv);elsefor(k=0;k<n;+k)optionk=copk; maxv=tv;copi=0;物品i不包含在当前方案的可能性 if(tv-ai. value>max v)if(i<n-l)find(i+1 ,tw,tv-ai .value);elsefor(k=0;k<n;+k)optionk=copk;maxv=tv-ai .value;2.2.2非递归实现(动态规划法)int knapsack(int &n,int &c,int sm,int pm,int vmm) int i,j;f

3、or (i=0;i<=n;i+)for(j=0;j<=c;j+)if(i=o|j=o)vi|j=o;else if(si>j)vij=vi-lj;else if(si<=j)viu=max(vi-lu,vi-lj-si+pi);return vnc;void traceback(int n,int cjnt sm,int xm,int vmm)for(int i=l;i<=n;i+)if(vfic=vi-lc)xi=o;elsexi=l; c=c-si;2.3、编程实现题忖要求;2.4、调试程序;2.5、实验数据及实验结果;2.5.1递归方法:输入数据:背包容量为

4、50公斤。物品1重10公斤,价值60元;物品2重20公斤, 价值100元;物品3重30公斤,价值120元。魏入物晶沖数:3输入各初品的重 = 10 20 30 输入各桝品的价100 120 輪入限罰重量隔输岀结果:2.5.2非递归方法:输入数据:背包容量为50公斤。物品1重10公斤,价值60元;物品2重20公斤, 价值100元;物品3重30公斤,价值120元。pleaseinputn :3pleaseinputtw:50pleaseinput110 20 30ipleaseinputv60 100120输出结果:2.6、算法时间复杂度2.6.1递归方法:o(n3)2.6.2非递归方法:o(n3

5、)三、总结通过本次实验,让我意识到我对编程的不足,但也了解到自己的成长空间还很大。附录:源代码(1)递归实现:#include <stdio.h>#definen 100 最大物品总种数 intn;/物品总种数float limitw;/限制的总重量float totv;/全部物品的总价值 float maxv;/解的总价值 int optionn;/解的选择 int copn;/当前解的选择 struct /物品结构float weight;float value;anj;void find(int i,float tw,float tv)int k;物品i包含在当前方案的可能性

6、 if(tw+ai.weight <= limitw) copij=l;if(i<n-l)find(i+l,tw+ai weight,tv); elsefor(k=0;k<n;+k)optionk=copk; maxv=tv;copi=0;物品i不包含在当前方案的可能性if(tv-ai. value>max v)if(i<n-l)find(i+1 ,tw,tv-ai .value);elsefor(k=0;k<n;+k) optionk=copk;maxv=tv-ai .value;int main()int k;float w,v;printfc输入物品种

7、数:”); scanf(”d“,&n);printf(u输入各物品的重量:”);for(k=0;k<n;+k) scanf(m%f&w);ak.weight = w;printf(“输入各物品的价值:”); for(totv=0.0,k=0;k<n;+k) scanf(m%f*,&v);ak.value = v;totv += v;printf(u输入限制重量:”); scanf(” f,&limitw); maxv=0.0;for(k=0;k<n;+k)copk=0; find(0,0.0,totv);print"选择的物品:”);

8、for(k=0;k<n;+k)printf(n%dm,optionk);printf(un 总价值为:%f*,maxv);getchar();getchar();return 0;(2)非递归实现:# include<iostream>using namespace std;#define max(a,b) a>b?a:b#define m 100void display(int &n,int &c,int sm,int pm)int i;cout«nplease input n:h;cin»n;cout«endl;cout

9、«nplease input tw:n;cin»c;cout«e ndl;cout«nplease input w:n«endl;s0=0;for(i=l;i<=n;i+)cin»si;cout«hplease input vh«endl;p0=0;for(i=l;i<=n;i+)cin»pfi;int knapsack(int &n,int &c,int sm,int pm,int vmmj)int i,j;for (i=0;i<=n;i+)for(j=0;j<=

10、c;j+)if(i=o|j=o)vilj=o;else if(si>j)viuj=vi-lu;else if(si<=j)viu=max(vi-l|j,vi-lu-si+pi);return vnc;;void traceback(int n,int c,int sm,int xm,int vmmj) for(int i=l;i<=n;i+)if(vic=vi-lc)xi=o;elsexi=l;c=c-si;;void main()int i,j,n,c; char ch;int sm,pm,xm;int vmmj;while(l) display(n,c,s,p);cout

11、«h运算结果如下:"«endl; for(i=l;i<i+)xi=0;knapsack(n,c,s,p,v);cout«" ”;fo 珀二 0;jv 二 c;j+)cout«j«h ”; cout«endl;for(i=0;i<=n;i+)cout«i«" ”;for(j=0;j<=c;j+)cout«vij«h ”;cout«endl; cout«endl;cout«h选择的物体向量表示为:";cout&#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论