描述:有N个物品装入一个容量为C的背包,每个物品的重量和价值已知,且物品可以部分装入(计算价值时,按重量比值计算)
#include <stdio.h>
int N,C;//物品个数、包的容量 举例:
int w[666],//各物品的重量 w[]={10, 20, 30};
p[666],//各物品的价值 p[]={60,100,120};
p_[666],//各物品的单位价值降序排列 p_[]={ 6, 5, 4};
x[666];//其中元素值为p_[]对应物品下标 x[]={ 0, 1, 2};
void sort()
{
int i,j,t;
for(i=0;i<N-1;i++)
for(j=i;j<N;j++)
if(p_[j]>p_[i])
{ //交换p_[i]和p_[j]的值
t=p_[i];
p_[i]=p_[j];
p_[j]=t;
}
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(p_[j]==p[i]/w[i])
x[j]=i;
}
int xy()
{
int cw=0,cp=0;//当前的重量、当前的价值
int i;
for(i=0;i<N;i++)
p_[i]=p[i]/w[i];//计算各物品的单位价值
sort();//通过对单位价值排序,找出递减序列对应下标存到x[]中
for(i=0;i<N;i++)
if(cw+w[ x[i] ]<C)
{//若当前物品装入后不超重,直接装入
cw+=w[ x[i] ];
cp+=p[ x[i] ];
}
else
{//若当前物品装入后超重,考虑按比例装入部分
cp+=(int)(1.0*p[ x[i] ]*(C-cw)/w[ x[i] ]);
cw=C;break;
}
return cp;
}
void main()
{
int k;
printf("输入个数和容量:");
scanf("%d%d",&N,&C);
printf("输入w[]:");
for(k=0;k<N;k++)
scanf("%d",&w[k]);
printf("输入p[]:");
for(k=0;k<N;k++)
scanf("%d",&p[k]);
printf("输出最大的价值:%d\n",xy());
}