您的位置:首页 > 其它

01背包问题C

2017-04-17 20:15 288 查看
有5个物品,编号1-5,背包的总承重为10,重量分别是【2,2,6,5,4】,价值分别是【6,3,5,4,6】。结果:最大价值15。

1,如果装入第i个物品时,它的重量大于背包的剩余容量,则装人前i个物品得到的最大价值和装入前i-1个物品得到的最大价是相同的,因为物品i不能装入背包,2,如果装入第i个物品时,它重量小于背包的剩余容量,则会有一下两种情况:(a)如果把第i个物品装入背包,则背包物品的价值等于第i-1个物品装入容量为j-wi 的背包中的价值加上第i个物品的价值vi; (b)如果第i个物品没有装入背包,则背包中物品价值就等于把前i-1个物品装入容量为j的背包中所取得的价值。显然,取二者中价值最大的作为把前i个物品装入容量为j的背包中的最优解。

#include<stdio.h>
int v2[100][100]={};
int x[50]={};//
int mymax(int x,int y)
{
if(x>y) return x;
else return y;
}
int backpack(int n,int *w,int *v,int *x,int c)
{
int i,j;
for(i=1;i<=n;++i)
{
for(j=1;j<=c;++j)
{
if(w[i]>j) v2[i][j]=v2[i-1][j];
else
v2[i][j]=mymax(v2[i-1][j-w[i]]+v[i],v2[i-1][j]);
}
}
j=c;
i=n;
for(;i>0;--i)//从后往前推。。。
{
if(v2[i][j]>v2[i-1][j])//如果装入第i个物体总价值比不装这个物体总价值大
{
x[i]=1;//选上
j=j-w[i];//把第i个物体从背包丢出去
}
else
x[i]=0;
}
for(int i=1;i<=n;++i)
{
printf("%d ",w[i]);
}
printf("\n");
for(int i=1;i<=n;++i)
{
printf("%d ",v[i]);
}
printf("\n");
for(int i=1;i<=n;++i)
{
printf("%d ",x[i]);
}
return v2
[c];

}
int main()
{
int n;
scanf("%d",&n);
int w[50];
int v[50];
int c;
scanf("%d",&c);
for(int i=1; i<=n; ++i)
scanf("%d%d",&w[i],&v[i]);
int s=backpack(n,w,v,x,c);
printf("%d\n",s);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息