当货物总重量∑Wi小于或等于M时,把所有货物装入,总价值就达到最大。因此,关键是解决当总重量大于M时装货的方法。
我们先从一个具体例子入手来研究一下本题的特点。
设n=3;M=20。
W1=15 W2=10 W3=8
P1=18 P2=15 P3=10
下面是我写的一个程序,不过好像有点问题,正确的结果应该是输出X1=2,X2=10,X3=8
但是输出的是:X1=10,X2=8,X3=2.
#include <stdio.h>
#include <math.h>
#define N 50
float find(float p[N],float w[N],float x[N] ,float M,int n) /*先放单位价值量大的物体,再考虑小的物体*/
{
int i;
float maxprice;
for (i = 0; i < n; i++)
x[i] = 0;
i = 0;
maxprice=0;
while (i < n && w[i] < M)
{
M=M-w[i];
x[i] =w[i]; /* 表示放入数量 */
maxprice=maxprice+p[i];
x[n-1]=M;
i++;
}
if (i < n &&M> 0)
{
maxprice=maxprice+p[i]*x[i]/w[i];
i++;
}
return maxprice;
}
int main()
{
int n,flag=1;
float temp,M,w[N],p[N],x[N];
int k;
printf("输入物品种数:\n");
scanf("%d",&n);
printf("输入背包重量:\n");
scanf("%f",&M);
printf("输入%d个物品的重量:\n",n);
for(k=0;k <n;k++)
scanf("%f",&w[k]);
printf("输入%d个物品的价值:\n",n);
for(k=0;k <n;k++)
scanf("%f",&p[k]);
while (flag != 0) /* 冒泡法 对单位价值进行排列*/
{
flag = 0;
for (k = 0; k < n-1; k++)
{
if (p[k]/w[k] < p[k+1]/w[k+1])
{
temp = p[k];
p[k] = p[k+1];
p[k+1] = temp;
temp = w[k];
w[k] = w[k+1];
w[k+1] = temp;
flag = 1;
}
}
}
printf("总价值最大是:%f\n",find(p,w,x,M,n));
for(k= 0; k < n; k++)
{
if(x[k]!=0)
{
printf("X%d: %f\n",k+1,x[k]);
}
}
return 0;
}
应该不是排序问题,主要是因为重新排序后,后来打印出来的X1,X2,X3对应的不是原来的W1,W2,W3.