算法设计与分析实验报告—01背包问题.docx
- 文档编号:260899
- 上传时间:2022-10-08
- 格式:DOCX
- 页数:6
- 大小:97.60KB
算法设计与分析实验报告—01背包问题.docx
《算法设计与分析实验报告—01背包问题.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告—01背包问题.docx(6页珍藏版)》请在冰豆网上搜索。
算法设计与分析
实验报告
—0/1背包问题
-
【问题描述】
给定n种物品和一个背包。
物品i的重量是,其价值为,背包容量为C。
问应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?
【问题分析】
0/1背包问题的可形式化描述为:
给定C>0,>0,>0,,要求找出n元0/1向量,使得,而且达到最大。
因此0/1背包问题是一个特殊的整数规划问题。
【算法设计】
设0/1背包问题的最优值为m(i,j),即背包容量是j,可选择物品为i,i+1,…,n时0/1背包问题的最优值。
由0/1背包问题的最优子结构性质,可以建立计算m(i,j)的递归式如下:
max{m(i+1,j),m(i+1,j-)+}
m(i,j)=
m(i+1,j)
m(n,j)=
0
【算法实现】
#include
#include
#include
intmin(intw,intc)
{
inttemp;
if(w else temp=c; returntemp; } Intmax(intw,intc) { inttemp; if(w>c) temp=w; else temp=c; returntemp; } voidknapsack(intv[],intw[],int**m,intc,intn) //求最优值 { intjmax=min(w[n]-1,c); for(intj=0;j<=jmax;j++) m[n][j]=0; for(intjj=w[n];jj<=c;jj++) m[n][jj]=v[n]; for(inti=n-1;i>1;i--) //递归部分 { jmax=min(w[i]-1,c); for(intj=0;j<=jmax;j++) m[i][j]=m[i+1][j]; for(intjj=w[i];jj<=c;jj++) m[i][jj]=max(m[i+1][jj],m[i+1][jj-w[i]]+v[i]); } m[1][c]=m[2][c]; if(c>=w[1]) m[1][c]=max(m[1][c],m[2][c-w[1]]+v[1]); cout< "< cout< cout<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"< } inttraceback(intx[],intw[],int**m,intc,intn)//回代,求最优解 { out< "< for(inti=1;i { if(m[i][c]==m[i+1][c]) x[i]=0; else { x[i]=1; c-=w[i]; } } x[n]=(m[n][c])? 1: 0; for(inty=1;y<=n;y++) cout< cout< returnx[n]; } voidmain() { int n,c; int**m; cout<<"&&&&&&&&&&&&&&&&&&&&&欢迎使用0-1背包问题程序&&&&&&&&&&&&&&&&&&&"< cout<<"请输入物品个数: "; cin>>n; cout< "; cin>>c; int*v=newint[n+1]; cout< "< for(inti=1;i<=n;i++) cin>>v[i]; int*w=newint[n+1]; cout< "< for(intj=1;j<=n;j++) cin>>w[j]; int*x=newint[n+1]; m=newint*[n+1]; //动态的分配二维数组 for(intp=0;p m[p]=newint[c+1]; knapsack(v,w,m,c,n); traceback(x,w,m,c,n); } 【运行结果】
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 实验 报告 01 背包 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)