揹包問題的演算法

gudesheng發表於2008-01-03

// BackPack.cpp : Defines the entry point for the console application.
//揹包問題處理標頭檔案
//揹包問題的演算法
/*
 作者:成曉旭
 時間:2001年10月12日(18:02:38-18:12:00)
 內容:完成揹包問題的程式
 時間:2001年10月9日(14:00:00-15:00:00)
 內容:完成“皇后”問題的程式序言部分
 ===================================================
 問題描述:
  在一個n*n的棋盤上放置n個不能互相捕捉的國際象棋“皇后”,
 並輸出所有合理的佈局情況.(在國際象棋中,皇后可以沿著縱、橫
 及兩條斜線共4個方向捕捉對手,可見,合適的解是在每行、每列及
 在一條斜線上只能有一個皇后<皇后相互捕捉>)
 程式設計思想:
 演算法描述:
 try(i,tw,tv)
 i: 物品編號
 tw: 當前選擇已達到的物品總重量和 
 tv: 本方案可能達到的物品總價值
 {
  //考慮物品i包含在當前方案中的可能性
  if(包含物品i是可接受的)
  {
   將物品i包含在當前方案中(設定物品i為包含狀態);
   if(i    try(i+1,tw+物品i的重量,tv);
   else
    //又一個完整方案,因為它比前面的方案好,以它作為最佳方案
    以當前方案為最佳方案儲存
   恢復物品i不包含狀態;
  }
  //考慮物品i不包含在當前方案中的可能性
  if(不包含物品i僅是可考慮的)
  {
   if(i    try(i+1,tw,tv-物品i的價值);
   else
    //又一個完整方案,因為它比前面的方案好,以它作為最佳方案
    以當前方案為最佳方案儲存
  }
 }
*/

#define N 100
int limitW,  //限制的總重量
 totalV,  //全部物品的總價值
 maxV;  //所選方案的最大總價值
int option[N], //解的選擇標誌
 curoption[N]; //當前解的選擇標誌
struct Goods  //物品資料結構
{
 int weight;
 int value;
};

Goods array[N];
int n;  //物品種數
// 引數定義
// i: 物品編號
// tw: 當前選擇已達到的物品總重量和 
// tv: 本方案可能達到的物品總價值
void Find(int i,int tw,int tv)
{
 int k;
 //考慮物品i包含在當前方案中的可能性
 if(tw+array[i].weight <= limitW)
 {//包含物品i是可接受的
  curoption[i] = 1; //將物品i包含在當前方案中(設定物品i為包含狀態);
  if(i   Find(i+1,tw+array[i].weight,tv);
  else
  {//又一個完整方案,因為它比前面的方案好,以它作為最佳方案
   for(k=0;k    option[k] = curoption[k];
   maxV = tv;
  }
  curoption[i] = 0; //恢復物品i不包含狀態
 }
 //考慮物品i不包含在當前方案中的可能性
 if(tv-array[i].value > maxV)
 {
  if(i   Find(i+1,tw,tv-array[i].value);
  else
  {//又一個完整方案,因為它比前面的方案好,以它作為最佳方案
   for(k=0;k    option[k] = curoption[k];
   maxV = tv-array[i].value;
  }
 }
}

void BackPack_Problem()
{
 int k,w,v;
 printf("輸入物品種數/n");
 scanf("%d",&n);
 printf("輸入各物品的重量及價值/n");
 for(totalV = 0,k=0;k {
  scanf("%d%d",&w,&v);
  array[k].weight = w;
  array[k].value  = v;
  totalV += v;
 }
 printf("輸入限制的重量/n");
 scanf("%d",&limitW);
 maxV = 0;
 for(k=0;k  curoption[k] = 0;
 Find(0,0,totalV);
 for(k=0;k  if(option[k])
   printf("%4d",k+1);
 printf("總價值 = %d/n",maxV);
 printf("/n/n應用程式正在執行....../n");
}

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935647


相關文章