0-1背包问题c语言程序_第1页
0-1背包问题c语言程序_第2页
0-1背包问题c语言程序_第3页
0-1背包问题c语言程序_第4页
0-1背包问题c语言程序_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、0-1 背包问题问题描述给定n种物品和一背包,物品i的重量是wi,其价值是pi,背包的容量是 M,如何选择装入背包中的物品总价值最大?问题分析记cim表示前i个物品,在背包容量大小为m的情况下,最大的装载量。如果不放第i件物品,那么问题就转化为前i-1件物品放入容量为m的背包中”价值为ci-1m;如果放第i件物品,那么问题就转化为前i-1件物品放入剩下的容量为m-wi的背包中”此时能获得的最大价值就是ci-1m-wi 再加上通过放入第i件物品获得的价值pi。因为背包最大容量 M未知。所以, 我们的程序要从1到M个一个的试。比如,开始任选N件物品的一个。看对应 M 的背包,能不能放进去,如果能放

2、进去,并且还有多的空间,则多出来的 空间里能放 N-1 物品中的最大价值。从以上最大价值的构造过程中可以看出:c(n,m)=maxc(n-1,m), c(n-1,m-wn)+p(n)其中ci-1m表示第i件物品不装入背包中,而ci-1m-wi+pi表示第i件 物品装入背包中。伪代码:1.最优值 max(x1*p1+x2*p2+,xn*pn)int knapsack(int m,int n,int *w,int *p)bool a;for(int i=1;i=n;i+)for(int j=1;j=m;j+)if(wici-1j; cij=a?pi+ci-1j-wi:ci-1j;/ 前者表示放 i

3、 物品,后者表示不放 i 物品else /i 号物品重量大于剩余容量,不能再放 i 号物品 cij=ci-1j;return(cnm);/ 最后的值即为最优值,返回主函数2.求最优 n 元 0-1 向量 (x1,x2,x3,xn)int getbest(int m,int n,int *w,int *p)if(n=0)return 0;/ 递归,每次递归 n 减 1,n 为 0 时退出 if(wnm)xn=0;getbest(m,n-1,w,p);else2/ 7/n油 c【n=3&p-n+c-nmw-nH31*也=x-nlln =n=3&anlnmuw*.淫 x-nllp x-nHc-nl

4、nmAHP-n+c-nl nmw-n妥巨)gefbesamw-nLnl wp)八e-se gefbesf(mb严 w.p)八琴 c-udecssio.hvsnc-udecss-ib.hvinfc15=25w 陟前mw裆毬血陟 R boo- xM5k/x 選弗咄 nlo1 可w inf knapsack(inf m5-f n5-f *w5-f *p) 宀boo- a八fo(inf iMAHnT+)fo(infli-nAHmj+)7if(wici-1j; cij=a?pi+ci-1j-wi:ci-1j;/ 前者表示放 i 物品,后者表示不放 i 物品else /i 号物品重量大于剩余容量,不能再放

5、 i 号物品 cij=ci-1j;return(cnm);/ 最后的值即为最优值,返回主函数/ 求最优 n 元 0-1 向量(x1,x2,x3 ,xn)int getbest(int m,int n,int *w,int *p)if(n=0)return 0;/ 递归,每次递归 n 减 1 ,n 为 0 时退出 if(wnm)xn=0;getbest(m,n-1,w,p);else/ 如果 cnm 由 pn+cn-1m-wn 而来,则 xn=1;/ 女口果 cnm由 cn-1m而来贝S xn=0;xn=cn-1m=pn+cn-1m-wn;if(xn)getbest(m-wn,n-1,w,p);

6、elsegetbest(m,n-1,w,p);void main()int m,n;int *w=NULL;int *p=NULL;printf( 输入背包容量和货物个数: );scanf(%d%d,&m,&n);p=(int *)calloc(n,sizeof(int); 分配 n*sizeof(int)的内存大小,存取 n 个物品的 价格 w=(int *)calloc(n,sizeof(int); 分配 n*sizeof(int)的内存大小,存取 n 个物品 的质量 if(!p|!w)/ 检测分配是否成功printf(Not Enough Memory!n);exit(1);/ 分配失败,退出for(int i=1;in+1;i+)printf( 物品 x%d 的重量和价值: ,i); scanf(%d%d,w+i,p+i);printf(n 总价值最大为: %d,knapsack(m,n,w,p); printf(n);for(i=0;i=n;i+)/ 打印执行动态规划每步的值 for(int j=0;j=m;j+)printf(%3d ,cij); if(j=m) printf(n);getbest(m,n,w,p);printf( 最优 n 元 0-1 向量为: n); for(i=1;i=

温馨提示

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

评论

0/150

提交评论