#include<stdio.h>intmain(){
printf("************贪处算法解决背包问题****************\n "); //标题float m , w[100], p[1000], P[1000], s , pp =0; //设置变量 int n , i, j, b[50], max;
printf (" 请输入货物的总类别数及背包的最大总容量\n");
printf ("货物的总类别数:");
scanf ("%d",& n );
printf ("背包的最大总容量:");
scanf ("%f",& m );
for (i=1, s=0; i <= n; i ++)//算出货物的总重量 s
{
printf ("货物的编号:% d\n重量:",i);
scanf ("%f",&w[i]);
printf ("价值:");
scanf ("%f",&p[i]);
P[i] = p[i];
s = s + w[i];
}
if ( s <= m ) //货物的总重量如果小于 m,则全装入
{
for (i=1; i <= n ; i ++)
{
pp += p[i];
}
printf ("选择的结果是:货物的总重量小于背包的容量故全装入背包,得到的总利润是:% f\n ",pp );
return0;
}
printf ("选择的结果是:\n");//当物品的总重量大于 m 时的情况 for (i=1; i <= n ; i ++)
{
max = 1 ;
for ( j =2; j <= n;j ++)
{
//比较物品的单位价值if (P[j] /w[j] > P[max] /w[max])
{
max=j;
}
P[max]=0; //标记已经排了序的物品
b[i]= max;
}
}
for ( i =1, s=0; s < m && i<= n ; i ++)
{
s= s + w [b[i]];
float W = w [b[i-1]];
if (s!= m) //超出背包容量
{
w [b[i-1]]= m -( s - w[b[i-1]]); //装入第 b [i-1]个物品的重量
p[b[i-1]]= w[b[i-1]] / W * p[b[i-1]]; //装入第 b [i-1]个物品的价值
}
for(j =1;j<=i-1;j++) //输出选取的结果
{
printf ("物品的编号:%d ,可装入该物品的重量:%f \n", b[j], w[b[j]]);
pp += p[b[j]];
}
}
printf("总价值%f\n",pp); //装入背包的物品的总价值return0;
}