算法设计背包问题_精品文档Word文件下载.docx
《算法设计背包问题_精品文档Word文件下载.docx》由会员分享,可在线阅读,更多相关《算法设计背包问题_精品文档Word文件下载.docx(3页珍藏版)》请在冰豆网上搜索。
背包的容量c,背包的容积d,物品的个数n。
接下来的n行表示n个物品的重量、体积和价值。
输出为最大的总价值。
问题分析:
标准0-1背包问题,MaxV表示前i个物品装入容量为j的背包中时所能产生的最大价值,结构体objec表示每一个可装入物品,其中w表示物品的重量,v表示物品的价值。
如果某物品超过了背包的容量,则该物品一定不能放入背包,问题就变成了剩余i-1个物品装入容量为j的背包中所能产生的最大价值;
如果该物品能装入背包,问题就变成i-1个物品装入容量为j-objec[i].w的背包所能产生的最大价值加上物品i的价值objec[i].v.
复杂性分析
时间复杂度,最好情况下为0,最坏情况下为:
(abc)
源程序
#include<
stdio.h>
stdlib.h>
#include<
time.h>
iostream>
iostream.h>
intV[200][200][200];
intmax(inta,intb)
{
if(a>
=b)
returna;
else
returnb;
}
intKnapSack(intn,intw[],intz[],intv[],intx[],intc,intb)
{
inti,p,q;
for(i=0;
i<
=n;
i++)
V[i][0][0]=0;
for(p=0;
p<
=c;
p++)
for(q=0;
q<
=b;
q++)
V[0][p][q]=0;
=n-1;
for(p=0;
for(q=0;
if(p<
w[i]&
&
z[i])
V[i][p][q]=V[i-1][p][q];
else
V[i][p][q]=max(V[i-1][p][q],V[i-1][p-w[i]][q-z[i]]+v[i]);
p=c;
q=b;
for(i=n-1;
i>
=0;
i--)
{
if(V[i][p][q]>
V[i-1][p][q])
{
x[i]=1;
p=p-w[i];
q=q-z[i];
}
else
x[i]=0;
}
cout<
<
"
选中的物品是:
;
n;
"
x[i];
endl;
intr=0;
if(x[i]==1)
r+=v[i];
else
r+=0;
returnr;
voidmain()
{
intmv;
intw[150];
intz[150];
intv[150];
intx[150];
intn,i;
intc;
intb;
//背包最大容量和容积
请输入背包的最大容量:
cin>
>
c;
请输入背包的最大容积:
b;
输入物品数:
请分别输入物品的重量:
i++)
cin>
w[i];
请分别输入物品的体积:
i++)
z[i];
请分别输入物品的价值:
v[i];
mv=KnapSack(n,w,z,v,x,c,b);
最大物品价值为:
mv<