背包问题
请各位给我讲解一下关于背包问题的具体怎样应用
#include<stdio.h>
main()
{
float v[]={25,24,15};/*物品价值*/
float w[]={18,15,10};/*物品重量*/
float Ratio[100],temp,temp_v,temp_w,tw,max=0.0;/*Ratio[]是求价值与重量的比值
temp_v累加物品价值
temp_w累加物品重量
max是求得的物品最大价值
tw表示背包的所能承受的最大重量*/
int i,j,k;
float biao[10];/*这个物品所取的重量之比,1表示全取.0.5表示取二分之一*/
for(k=0;k<10;k++)
biao[k]=0;
printf("请输入背包的最大容量:tw\n");
scanf("%f",&tw);
for(i=0;i<3;i++)
Ratio[i]=(v[i]/w[i]);
for(i=0;i<2;i++)/*按照比值将物品价值和重量降序排列*/
{
temp=Ratio[i+1];
temp_v=v[i+1];
temp_w=w[i+1];
j=i;
while(j>-1&&temp>Ratio[j])
{
Ratio[j+1]=Ratio[j];
v[j+1]=v[j];
w[j+1]=w[j];
j--;
}
Ratio[j+1]=temp;
v[j+1]=temp_v;
w[j+1]=temp_w;
}
i=0;
k=0;
while(tw>0)/*开始取物品.如果能装的一个就全装*/
{
if(tw>w[i])/*全装情况*/
{
tw=tw-w[i];
max=max+v[i];
biao[k++]=1;
i++;
}
else if(tw>0&&tw<=w[i])/*只能装1/n的情况*/
{
max=max+((tw/w[i])*v[i]);
biao[k++]=tw/w[i];
tw=0;
i++;
}
}
for(k=0;k<10;k++)/*以下是输出*/
if(biao[k]!=0)
printf("%f\t",biao[k]);
printf("\n");
printf("物品的重量是:\n");
for(k=0;k<10;k++)
if(biao[k]!=0)
printf("%f\t",w[k]);
printf("\n");
printf("所取的物品重量是:\n");
for(k=0;k<10;k++)
if(biao[k]!=0)
printf("%f\t",biao[k]*w[k]);
printf("\n");
printf("背包所取的重量是:%f\n",max);
}