背包问题(可拆背包)

来源:互联网 发布:js实现word预览 编辑:程序博客网 时间:2024/06/05 21:58
背包问题(可拆背包)
已知n种物品和一个可容纳c重量的背包,物品i的重量用数组w[i]来表示,产生的效益用p[i]来表示装包物品可拆,
即可装每种物品的一部分。显然物品i的一部分x[i]放入背包中的重量为x[i]*w[i],可产生的效益为x[i]*p[i]。(0<x[i]<1) 
 设计如何装包可使装包所得效益最大?
 思路:贪心算法设计
 要是整体效益最大,即目标函数最大,每次选择单位重量效益最高的装包,这就是贪心策略。各物品按单位重量的效益进行降序排列,
 从单位重量效益最高的开始装包,知道包满为止。
  #include<stdio.h>
#define N 100
int main()
{
float p[N],w[N],x[N]={0},c,cw,s,h;//c为包的容量,cw为装入物品后包剩余的容量,s为价值量 
int i,j,n;
printf("输入物品的个数n\n");//n为物品的个数 
scanf("%d",&n);
printf("输入书包的容量c\n") ;
scanf("%f",&c);
for(i=1;i<=n;i++)
{
printf("输入各个商品的重量和价值\n");
scanf("%f %f",&w[i],&p[i]);
}
for(i=1;i<=n-1;i++)    //冒泡排序的思想 
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;
    for(i=1;i<=n;i++)
    {
    if(w[i]>cw)
   
    x[i]=(float)(cw/w[i]);
       s=s+p[i]*x[i];
       break;
  } 


if(w[i]<=cw)
{x[i]=1.0;
cw=cw-w[i];
s=s+p[i];
   }
   } 
for(i=1;i<=n;i++)
{
   if(x[i]==1.0) 
printf("\n装入质量为%5.1f 效益为%5.1f的物品"q,w[i],p[i]);
else if(x[i]<1&&x[i]>0)
printf("\n装入质量为%5.1f 效益为%5.1f的物品百分之%5.1f",w[i],p[i],x[i]*100);
else break; 

printf("\n最大收益为%7.1f",s);

}


0 0
原创粉丝点击