回溯 八皇后問題 與 0 1揹包

2022-05-23 19:30:10 字數 2276 閱讀 9435

我們有乙個 8x8 的棋盤,希望往裡放 8 個棋子(皇后),每個棋子所在的行、列、對角線都不能有另乙個棋子。你可以看我畫的圖,第一幅圖是滿足條件的一種方法,第二幅圖是不滿足條件的。八皇后問題就是期望找到所有滿足這種要求的放棋子方式。

我們把這個問題劃分成 8 個階段,依次將 8 個棋子放到第一行、第二行、第三行……第八行。在放置的過程中,我們不停地檢查當前放法,是否滿足要求。如果滿足,則跳到下一行繼續放置棋子;如果不滿足,那就再換一種放法,繼續嘗試。

回溯演算法非常適合用遞迴**實現,所以,我把八皇后的演算法翻譯成**:

public

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();}}

我們有乙個揹包,揹包總的承載重量是 wkg。現在我們有 n 個物品,每個物品的重量不等,並且不可分割。我們現在期望選擇幾件物品,裝載到揹包中。在不超過揹包所能裝載重量的前提下,如何讓揹包中物品的總重量最大?

為什麼叫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)

}

回溯可以新增備忘錄做優化

優化後如下:

private

int 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)

}

view code

回溯法(揹包問題和八皇后問題)

演算法分析 給定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 種選擇,即裝入揹包或不裝入揹包,並且物品數和揹包容量已給定,要計算裝入揹包物品的最大...