揹包問題的演算法
// 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
相關文章
- 揹包問題(01揹包與完全揹包)
- 揹包問題
- 【演算法】0-1揹包問題演算法
- 01揹包問題
- 01 揹包問題
- 01揹包和完全揹包問題解法模板
- 揹包九講問題
- 經典揹包問題
- 揹包問題大合集
- 部分揹包問題(挖
- 005多重揹包問題||
- 從【零錢兌換】問題看01揹包和完全揹包問題
- 01揹包問題的解決
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 揹包問題例題總結
- 01揹包問題理解動態規劃演算法動態規劃演算法
- 揹包問題的一道經典問題
- 【leetcode】揹包問題彙總LeetCode
- 2. 01揹包問題
- 位元組面試演算法題-0,1揹包問題面試演算法
- 揹包問題解題方法總結
- JavaScript中揹包問題(面試題)JavaScript面試題
- 51nod 1597 有限揹包計數問題 (揹包 分塊)
- chapter12-2-揹包問題APT
- 關於各種揹包問題
- 【動態規劃】揹包問題動態規劃
- 二維費用揹包問題
- 深入剖析多重揹包問題(上篇)
- 深入剖析多重揹包問題(下篇)
- 揹包問題----動態規劃動態規劃
- 你真的懂01揹包問題嗎?01揹包的這幾問你能答出來嗎?
- leetcode題解(0-1揹包問題)LeetCode
- 2024.10.2 座標變化 + 揹包問題剩下的題
- 【資料結構與演算法】揹包問題總結梳理資料結構演算法
- javascript演算法基礎之01揹包,完全揹包,多重揹包實現JavaScript演算法
- HDU Piggy-Bank(完全揹包問題)
- 整數0-1揹包問題
- 動態規劃 01揹包問題動態規劃
- 【動態規劃】01揹包問題動態規劃