求助,以下的程序怎么改啊
假定有n个物体和一个背包,物体i 有质量wi,价值为pi,而背包的载荷能力为M。若将物体i的一部分xi(1<=i<=n,0<=xi<=1)装入背包中,则有价值pi*xi。在约束条件(w1*x1+w2*x2+…………+wn*xn)<=M下使目标(p1*x1+p2*x2+……+pn*xn)达到极大,此处0<=xi<=1,pi>0,1<=i<=n.这个问题称为背包问题(Knapsack problem)。设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]);
}
}
system("pause");
return 0;
}
求指教啊!!!!!!!!!!!!!!!!!!!!!!