算法设计与分析实验报告—01背包问题Word下载.docx

上传人:wj 文档编号:13017356 上传时间:2022-10-02 格式:DOCX 页数:7 大小:86.63KB
下载 相关 举报
算法设计与分析实验报告—01背包问题Word下载.docx_第1页
第1页 / 共7页
算法设计与分析实验报告—01背包问题Word下载.docx_第2页
第2页 / 共7页
算法设计与分析实验报告—01背包问题Word下载.docx_第3页
第3页 / 共7页
算法设计与分析实验报告—01背包问题Word下载.docx_第4页
第4页 / 共7页
算法设计与分析实验报告—01背包问题Word下载.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

算法设计与分析实验报告—01背包问题Word下载.docx

《算法设计与分析实验报告—01背包问题Word下载.docx》由会员分享,可在线阅读,更多相关《算法设计与分析实验报告—01背包问题Word下载.docx(7页珍藏版)》请在冰豆网上搜索。

算法设计与分析实验报告—01背包问题Word下载.docx

因此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);

【运行结果】

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1