算法设计与分析实验报告—01背包问题Word文件下载.docx
- 文档编号:13191007
- 上传时间:2022-10-08
- 格式:DOCX
- 页数:6
- 大小:97.60KB
算法设计与分析实验报告—01背包问题Word文件下载.docx
《算法设计与分析实验报告—01背包问题Word文件下载.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告—01背包问题Word文件下载.docx(6页珍藏版)》请在冰豆网上搜索。
因此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<
iostream.h>
#include<
string.h>
iomanip.h>
intmin(intw,intc)
{
inttemp;
if(w<
c) temp=w;
else
temp=c;
returntemp;
}
Intmax(intw,intc)
{
if(w>
}
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;
m[i][j]=m[i+1][j];
for(intjj=w[i];
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<
<
endl<
"
最优值:
"
<
m[1][c]<
endl;
cout<
endl;
&
inttraceback(intx[],intw[],int**m,intc,intn)//回代,求最优解
out<
得到的一组最优解如下:
for(inti=1;
i<
n;
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<
x[y]<
\t"
;
returnx[n];
voidmain()
int n,c;
int**m;
欢迎使用0-1背包问题程序&
请输入物品个数:
"
cin>
>
n;
请输入背包的承重:
c;
int*v=newint[n+1];
请输入每个物品的价值(v[i]):
cin>
v[i];
int*w=newint[n+1];
请输入每个物品的重量(w[i]):
for(intj=1;
w[j];
int*x=newint[n+1];
m=newint*[n+1];
//动态的分配二维数组
for(intp=0;
p<
n+1;
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 背包 问题