連續郵資問題 回溯法

2021-10-05 10:49:41 字數 1466 閱讀 7658

需要注意的是:

問題的解空間樹是虛擬的,並不需要在演算法執行時構造一棵真正的樹結構,只需要儲存從根節點到當前節點的路徑。

假設某國家發行了n種不同面值的郵票,並且規定每張信封上最多隻允許貼m張郵票。連續郵資問題要求對於給定的n和m,給出郵票面值的最佳設計,在1張信封上貼出從郵資1開始,增量為1的最大連續郵資區間。 例如當n=5,m=4時,面值為1,3,11,15,32的5種郵票可以貼出郵資的最大連續區間是1到70。

5 4

1 3 11 15 32

70
參考:

每張信封最多貼m張郵票,也就是說可能貼了m張,也可能貼了0張、1張等等。為了便於計算,我們可以把未貼滿m張郵票看作貼了x張郵票和m-x張面值為0的郵票,從而構造一棵完全多叉樹。若求所有可能的組合情況,解空間是(n+1)^m。

以n=5,m=4為例,解空間為完全多叉樹,圖中只以一條路徑為例:

讀入郵票面值數n,每張信封最多貼的郵票數m

讀入郵票面值陣列nums,除了正常面值,再加入乙個值為0的面值

重複步驟3直到沒有滿足當前區間最大值maxvalue+1的可行解,則當前記錄的maxvalue就是區間最大值

public

class

main

solution

(n, m, nums)

; system.out.

println

("maxvalue="

+ maxvalue);}

}public

static

void

solution

(int n,

int m,

int[

] nums)

else}}

/** * 搜尋解空間,找到比當前區間最大值大1的解

** @param t 當前郵票數量

*/public

static

void

search

(int t)

// 此時已經是葉節點,若不是可行解,則需要回溯到t-1

return;}

// 未結束,繼續向下搜尋

// 遍歷所有面值

for(

int i =

0; i < nums.length; i++

)// 若超過了區間最大值,則當前面值不是可行解,需要回溯,計算下乙個面值

回溯法求解連續郵資問題

內容 假設某國家發行了n中不同面值的郵票,並且規定每張信封上最多隻允許貼m張。要求 對於給定的m和n的值,給出郵票面值的最佳設計,使得可以在一張信封上貼出從郵資1開始,增量為1的最大連續郵資區間。對於連續郵資的問題,由於實驗開始是僅給出面值的數量,而面值的具體值是未知的。但是由於郵資需要從1開始,因...

連續郵資問題 回溯 動態規劃)

這個程式debug了好長時間.乙個晚上都耗上面了 這個程式實際上每一部分並不複雜,但是動態規劃那邊邊界錯了好長時間。題目 假設國家發行了n種不同面值的郵票,並且規定每張信封上最多隻允許貼m張郵票。連續郵資問題要求對於給定的n和m的值,給出郵票面值的最佳設計,在1張信封上可貼出從郵資1開始,增量為1的...

連續郵資問題

王曉東老師編著的 計算機演算法設計與分析 5.12 節以 連續郵資問題 為例展示了回溯法的應用。講解比較簡略,對於搜尋出一張新的郵票面值後如何更新最大連續郵資區間這一點沒有過多的說明。以下是自己對於這一節學習的一點筆記。實際上,關於剛才所說的更新最大連續郵資區間的方法,可以歸結到一種 等價類 的思想...