我們有乙個 8x8 的棋盤,希望往裡放 8 個棋子(皇后),每個棋子所在的行、列、對角線都不能有另乙個棋子。你可以看我畫的圖,第一幅圖是滿足條件的一種方法,第二幅圖是不滿足條件的。八皇后問題就是期望找到所有滿足這種要求的放棋子方式。
我們把這個問題劃分成 8 個階段,依次將 8 個棋子放到第一行、第二行、第三行……第八行。在放置的過程中,我們不停地檢查當前放法,是否滿足要求。如果滿足,則跳到下一行繼續放置棋子;如果不滿足,那就再換一種放法,繼續嘗試。
回溯演算法非常適合用遞迴**實現,所以,我把八皇后的演算法翻譯成**:
public我們有乙個揹包,揹包總的承載重量是 wkg。現在我們有 n 個物品,每個物品的重量不等,並且不可分割。我們現在期望選擇幾件物品,裝載到揹包中。在不超過揹包所能裝載重量的前提下,如何讓揹包中物品的總重量最大?class
queens8
public
void cal8queens(int row)
for (int column = 0; column < 8; ++column)
system.out.println("------------colum="+column);}}
private
boolean isok(int row, int column)
if (rightup < 8)
--leftup; ++rightup;
}return
true
; }
private
void printqueens(int result)
system.out.println();
}system.out.println();}}
為什麼叫0-1?應為物品是不可分割的,要麼裝要麼不裝。
1.確定好最終返回條件
2.轉移公式
具體例子:小明有個揹包,最大裝9kg物品,現在桌上有幾個物品,重量(kg)分別是2,2,4,6,3 問,小明包裡能裝的最大多少kg?
private static int weight = ; // 物品重量private static int n = 5; // 物品個數
private static int w = 9; // 揹包承受的最大重量
**如下:
public回溯可以新增備忘錄做優化int maxw = integer.min_value; //
儲存揹包中物品總重量的最大值
//cw表示當前已經裝進去的物品的重量和;i表示考察到哪個物品了;
//w揹包重量;weight表示每個物品的重量;n表示物品個數
//假設揹包可承受重量9,物品個數5,物品重量儲存在陣列weight中,那可以這樣呼叫函式:
//f(0, 0, weight, 5, 9)
public
void f(int i, int cw, int items, int n, int
w) f(i+1, cw, items, n, w); //這裡遞迴只寫cw,說明這行**不裝物品
if (cw + items[i] <= w)
}
優化後如下:
privateview codeint maxw = integer.min_value; //
結果放到maxw中
private
int weight = ; //
物品重量
private
int n = 5; //
物品個數
private
int w = 9; //
揹包承受的最大重量
private
boolean mem = new
boolean[5][10]; //
備忘錄,預設值false
public
void f(int i, int cw)
if (mem[i][cw]) return; //
重複狀態
mem[i][cw] = true; //
記錄(i, cw)這個狀態
f(i+1, cw); //
選擇不裝第i個物品
if (cw + weight[i] <=w)
}
回溯法(揹包問題和八皇后問題)
演算法分析 給定n 中物品和乙個容量為 c的揹包,物品 i的重量為 wi,其價值為 vi,揹包問題是如何選擇裝入揹包的物品 物品不可分割 使得裝入揹包的物品的價值為最大 考慮到每種物品只有2 種選擇,即裝入揹包或不裝入揹包,並且物品數和揹包容量已給定,要計算裝入揹包物品的最大價值和最優裝入方案,可用...
回溯 0 1揹包問題
回溯演算法的要點 1,針對所給問題,定義問題的解空間。2,確定容易搜尋的解空間的組織結構。3,通過剪枝優化搜尋過程。下面通過求解0 1揹包問題來分析使用回溯演算法的過程 1,根據問題的描述,設所有的物件數是n,對應的重量和價值分別為w 0 n 1 和v 0 n 1 於是這個問題就轉化成在這n件物件中...
回溯 01揹包問題
這裡再簡單寫一下問題要求 給定n中物品和乙個容量為c的揹包,物品i的重量為wi,其價值為vi,0 1揹包問題是如何選擇裝入揹包的物品 物品不可分割 使得裝入揹包的物品的價值為最大。1.題目分析 考慮到每種物品只有2 種選擇,即裝入揹包或不裝入揹包,並且物品數和揹包容量已給定,要計算裝入揹包物品的最大...