贪心算法求可拆背包问题

//  可拆背包问题,c741 
#include <stdio.h>
#define N 100
void main()
{float p[N],w[N],x[N],c,cw,s,h;
 int i,j,n;
 printf("\n input n:"); scanf("%d",&n);      //  输入已知条件  
 printf("input c:"); scanf("%f",&c);
 for(i=1;i<=n;i++)
    {printf("input w%d,p%d:",i,i);
     scanf("%f,%f",&w[i],&p[i]);
    }
for(i=1;i<=n-1;i++)     //  对n件物品按单位重量的效益从大到小排序 
for(j=i+1;j<=n;j++)
   if(p[i]/w[i]<p[j]/w[j])
     { h=p[i];p[i]=p[j]; p[j]=h;
       h=w[i];w[i]=w[j]; w[j]=h;
     }
cw=c;s=0;                        // cw为背包还可装的重量 
for(i=1;i<=n;i++)
{if(w[i]>cw) break;
   x[i]=1.0;                     //  若w(i)<=cw,整体装入
   cw=cw-w[i];
   s=s+p[i];
}
x[i]=(float)(cw/w[i]);            //  若w(i)>cw,装入一部分x(i) 
s=s+p[i]*x[i];
printf("装包:");                 //  输出装包结果 
for(i=1;i<=n;i++)
  if(x[i]<1)  break;
  else
    printf("\n 装入重量为%5.1f效益为%5.1f的物品.",w[i],p[i]);
if(x[i]>0 && x[i]<1)
    printf("\n 装入重量为%5.1f效益为%5.1f的物品百分之%5.1f.",w[i], p[i],x[i]*100);
printf("\n 所得最大效益为:%7.1f ",s);
}

 

 

 

 

posted on 2017-12-31 22:28  小星_log  阅读(244)  评论(0编辑  收藏  举报