#include
#include
#define ymax 100
#define nmax 100
float f[nmax][ymax];
void Knapsack(float p[],int w[],int c,int n)
{
int y=0,i=0;
for(y=0;y
f[n][y]=0;
for(y=w[n];y<=c;y++)
f[n][y]=p[n];
for(i=n-1;i>1;i–)
{
for(y=0;y
f[i][y]=f[i+1][y];
for(y=w[i];y<=c;y++)
{ if(f[i+1][y]>f[i+1][y-w[i]]+p[i])
f[i][y]=f[i+1][y];
else
f[i][y]=(f[i+1][y-w[i]]+p[i]);
}
}
f[1][c]=f[2][c];
if(c>=w[1])
if(f[1][c]>(f[2][c-w[1]]))
f[1][c]=f[1][c];
else
f[1][c]=f[2][c-w[1]]+p[1];
}
void Traceback(int w[],int c,int n,int x[])
{
int i=0;
for(i=1;i
{
if(f[i][c]==f[i+1][c])
x[i]=0;
else
{
x[i]=1;
c-=w[i];
}
}
if(x[n]==f[n][c])
x[n]=0;
else
x[n]=1;
}
int main()
{
float s=0,temp=0;
float *p;
int m=0,n=0,i=0,*w,*x;
printf(“请输入背包的最大体积:\nm=”);
scanf(“%d”,&m);
printf(“请输入背包中物品的个数:\nn=”);
scanf(“%d”,&n);
p=(float*)malloc((n+1)*sizeof(float));
printf(“请输入各物品的价值:\n”);
for(i=1;i<=n;i++)
scanf(“%f”,p+i);
w=(int*)malloc((n+1)*sizeof(int));
printf(“请输入各物品的重量:\n”);
for(i=1;i<=n;i++)
scanf(“%d”,w+i);
x=(int*)malloc((n+1)*sizeof(int));
Knapsack(p,w,m,n);
Traceback(w,m,n,x);
s=f[1][m];
printf(“您装入背包中物品的总价值为: %f\n”,s);
for(i=1;i<=n;i++)
{
if(x[i]==1)
{
printf(“ 物品价值: %f”,p[i]);
printf(“ 物品重量: %d\n”,w[i]);
}
}
return 0;
}