#include<stdio.h>
void package_part(int *w,int *v,double *p,int n,int c,int *flag)
{
int i,j,temp;
double tempD,totalValue = 0.0;
//计算单位
for(i=0;i<n;i++)
{
p[i] = (double)v[i] / (double)w[i];
flag[i] = i;
}
//根据单价排序,flag数组保存物品的下标
for(i=0;i<n;i++)
{
for(j=n-1;j>i;j--)
{
if(p[j] > p[j-1])
{
temp = flag[j];
flag[j] = flag[j-1];
flag[j-1] = temp;
tempD = p[j];
p[j] = p[j-1];
p[j-1] = tempD;
}
}
}
//̰贪心法得出应该装入的物品
for(i=0;i<n;i++)
{
if(c >= w[flag[i]])
{
totalValue += v[flag[i]];
c -= w[flag[i]];
printf("第%d号物品整个放入\n",flag[i]);
}else
{
totalValue += p[flag[i]] * (double)c / (double) w[flag[i]];
printf("第%d号物品放入了%f\n",flag[i],(double)c / (double) w[flag[i]]);
break;
}
}
printf("总价值为:%f",totalValue);
}
void main()
{
int c, n ;
printf("请输入背包的最大容量:");
scanf("%d",&c);
printf("输入物品数:");
scanf("%d",&n);
int *w=(int *)malloc(n*sizeof(int));
int *v=(int *)malloc(n*sizeof(int));
printf("请分别输入物品的重量:");
for(int i=0;i<n;i++)
scanf("%d",&w[i]);
printf("请分别输入物品的价值ֵ:");
for(int i=0;i<n;i++)
scanf("%d",&v[i]);
double p[] = {0}; //每个物品的单位价值
int flag[10]; //用于排序
package_part(w,v,p,n,c,flag);
}
