用贪心算法解背包问题

 #include <iostream.h>

typedef struct _goodInfo
{
 float v;  //物品效益
 float w;  //物品重量
 float x;  //物品该放的数量
 int  flag; //物品编号
}goodInfo;

//按照物品效益对物品进行插入排序
void InsertSort(goodInfo goods[], int n)
{
 int i,j;

 for (j=2; j<=n; j++)
 {
  goods[0] = goods[j];
  i=j-1;
  while (goods[i].v < goods[0].v)
  {
   goods[i+1]=goods[i];
   i--;
  }
  goods[i+1] = goods[0];
 }
}

void Bag(goodInfo goods[], float M, int n)
{
 //先排序
 InsertSort(goods,n);
 
 float cu; //背包剩余容量
 int i,j;
 
 //初始每个物品该放的数量为0
 for (i=1; i<=n; i++)
 {
  goods[i].x = 0.0;
 }
 cu = M;
 for (i=1;i<=n;i++)
 {
  if (goods[i].w > cu)
  {
   break; //当物品的重量大于剩余容量时,跳出
  }
  goods[i].x = 1;
  cu -= goods[i].w; //确定背包新的剩余容量
 }
 if (i <= n)
 {
  goods[i].x = cu/goods[i].w; //该物品所需要放的量
 }

 //按物品编号做降序排列
 for (j=2; j<=n; j++)
 {
  goods[0] = goods[j];
  i = j-1;

  while (goods[0].flag < goods[i].flag)
  {
   goods[i+1] = goods[i];
   i--;
  }
  goods[i+1] = goods[0];
 }

 //输出解
 cout<<"最优解为:"<<endl;
 for (i=1;i<=n;i++)
 {
  cout<<"第"<<i<<"件物品需要放:";
  cout<<goods[i].x<<endl;
 }
}

int main()
{
 int j,n;
 float M;
 goodInfo *goods;

 while (j)
 {
  cout<<"请输入物品的总数量:";
  cin>>n;
  goods = new goodInfo[n+1];
  cout<<"请输入背包的最大容量:";
  cin>>M;
  cout<<endl;

  int i;
  for (i=1;i<=n;i++)
  {
   goods[i].flag = i;
   cout<<"请输入第"<<i<<"件物品的重量:";
   cin>>goods[i].w;
   cout<<"请输入第"<<i<<"件物品的效益:";
   cin>>goods[i].v;
   goods[i].v = goods[i].v/goods[i].w;
   cout<<endl;
  }
  Bag(goods,M,n);
  cout<<"Press <1> to run again"<<endl;
  cout<<"Press <0> to exit"<<endl;
  cin>>j;
 }

 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值