0-1背包问题
#include<stdio.h>
int C=10;
int vl[10][10];
int max(int a,int b)
{
if(a>=b)
return a;
else
return b;
}
int KnapSack(int w[],int v[],int x[],int n)
{
int i,j;
for(i=0;i<=n;i++)
vl[i][0]=0;
for(j=0;j<=C;j++)
vl[0][j]=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=C;j++)
{
if(j<w[i-1])
vl[i][j]=vl[i-1][j];
else
vl[i][j]=max(vl[i-1][j],vl[i-1][j-w[i-1]]+v[i-1]);
}
}
j=C;
for(i=n;i>=1;i--)
{
if(vl[i][j]>vl[i-1][j])
{
x[i]=1;
j=j-w[i-1];
}
else
x[i]=0;
}
printf("装入物品的编号是:\n");
for(i=1;i<=n;i++){
if(x[i]==1)
{
printf("%d ",i);
}
}
printf("\n");
return vl[n][C];
}
void main()
{
int w[4]={2,3,4,7};
int v[4]={1,3,5,9};
int x[5];
printf("物品价值是:\n");
for(int i=0;i<4;i++)
{
printf("%d ",v[i]);
}
printf("\n");
printf("物品重量是:\n");
for(int j=0;j<4;j++)
{
printf("%d ",w[j]);
}
printf("\n");
printf("最大价值是:\n%d\n",KnapSack(w,v,x,4));
}
运行截图
