用貪心算法解揹包問題

 #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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章