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

下载本文档

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

文档简介

华南农业大学算法分析与设计课程实验专业年级:10信息与计算科学2班 学生学号: 22号 学生姓名: 梁高鼎 实验题目:用动态规划法求解0-1背包问题指导老师: 梁 茹 冰 实验时间: 2012年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=1;if(in-1)find(i+1,tw+ai.weight,tv);elsefor(k=0;kmaxv)if(in-1)find(i+1,tw,tv-ai.value);elsefor(k=0;kn;+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; for (i=0;i=n;i+) for(j=0;jj) Vij=Vi-1j; else if(si=j) Vij=max(Vi-1j,Vi-1j-si+pi); return VnC; void traceback(int n,int C,int sM,int xM,int VMM) for(int i=1;i=n;i+) if(ViC=Vi-1C) xi=0; else xi=1; C=C-si; 2.3、编程实现题目要求; 2.4、调试程序; 2.5、实验数据及实验结果;2.5.1 递归方法:输入数据:背包容量为50公斤。物品1重10公斤,价值60元;物品2重20公斤,价值100元;物品3重30公斤,价值120元。输出结果:2.5.2 非递归方法:输入数据:背包容量为50公斤。物品1重10公斤,价值60元;物品2重20公斤,价值100元;物品3重30公斤,价值120元。输出结果: 2.6、算法时间复杂度 2.6.1 递归方法:O(n3) 2.6.2 非递归方法:O(n3)三、总结 通过本次实验,让我意识到我对编程的不足,但也了解到自己的成长空间还很大。 附录:源代码(1) 递归实现:#include #define N 100 /最大物品总种数int n;/物品总种数float limitW;/限制的总重量float totV;/全部物品的总价值float maxv;/解的总价值int optionN;/解的选择int copN;/当前解的选择struct /物品结构float weight;float value;aN;void find(int i,float tw,float tv)int k;/物品i包含在当前方案的可能性if(tw+ai.weight = limitW)copi=1;if(in-1)find(i+1,tw+ai.weight,tv);elsefor(k=0;kmaxv)if(in-1)find(i+1,tw,tv-ai.value);elsefor(k=0;kn;+k)optionk=copk;maxv=tv-ai.value;int main()int k;float w,v;printf(输入物品种数:);scanf(%d,&n);printf(输入各物品的重量:);for(k=0;kn;+k)scanf(%f,&w);ak.weight = w;printf(输入各物品的价值:);for(totV=0.0,k=0;kn;+k)scanf(%f,&v);ak.value = v;totV += v;printf(输入限制重量:);scanf(%f,&limitW);maxv=0.0;for(k=0;kn;+k)copk=0;find(0,0.0,totV);printf(选择的物品:);for(k=0;kn;+k)printf(%d,optionk);printf(n总价值为: %f,maxv);getchar(); getchar() ; return 0; (2)非递归实现:#includeusing namespace std;#define max(a,b) ab?a:b#define M 100void display(int &n,int &C,int sM,int pM) int i; coutn; coutendl; coutC; coutendl; coutplease input w:endl; s0=0; for(i=1;isi; coutplease input vendl; p0=0; for(i=1;ipi;int knapsack(int &n,int &C,int sM,int pM,int VMM) int i,j; for (i=0;i=n;i+) for(j=0;jj) Vij=Vi-1j; else if(si=j) Vij=max(Vi-1j,Vi-1j-si+pi); return VnC; void traceback(int n,int C,int sM,int xM,int VMM) for(int i=1;i=n;i+) if(ViC=Vi-1C) xi=0; else xi=1; C=C-si; ;void main() int i,j,n,C; char ch; int sM,pM,xM; int VMM; while(1) display(n,C,s,p); cout运算结果如下:endl; for(i=1;i=n;i+) xi=0; knapsack(n,C,s,p,V); cout ; for(j=0;j=C;j+) coutj ; coutendl; for(i=0;i=n;i+) couti ; for(j=0;j=C;j+) coutVij ; coutendl; cout

温馨提示

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

评论

0/150

提交评论