連續郵資問題

2021-08-24 19:33:05 字數 909 閱讀 4632

ø

假設國家發行了n種不同面值的郵票,並且

規定每張信封上最多隻允許貼m張郵票。連

續郵資問題要求對於給定的n和m的值,給出

郵票面值的最佳設計,在1張信封上可貼出

從郵資1開始,增量為1的最大連續郵資區

間。(noip99)

ø例如,當n=2、m=3時,如果面值分別為1

、4,則在l-6之間的每乙個郵資值都能得到(當

然還有8、9和12);如果面值分別為1、3,則

在1-7之間的每乙個郵資值都能得到。可以

驗證當n=2、m=3時,7就是可以得到連續的郵

資最大值,面值為l、3。

ø又如,當n=5和m=4時,面值為(1,3,11,15,32)

的5種郵票可以貼出郵資的最大連續郵資區

間是1到70。

ø基本思路:搜尋所有可行解,找出最大連續郵資區間的方案 ø

解向量:用n元組x[1:n]表示n種不同的郵票面值,並約定它們從小到大排列。x[1]=1是唯一的選擇。 ø

可行性約束函式:已選定x[1:i-1],最大連續郵資區間是1—r,接下來x[i]的可取值範圍是x[i-1]+1—r+1。 ø

如何確定r的值:計算x[1:i]的最大連續郵資區間在本演算法中被頻繁使用到,因此勢必要找到乙個高效的方法。考慮到直接遞迴的求解複雜度太高,我們不妨嘗試計算用不超過m張面值為x[1:i]的郵票貼出郵資k所需的最少郵票數y[k]。通過y[k]可以很快推出r的值。事實上,y[k]可以通過遞推在o(n)時間內解決:

for (int j=0; j<= x[i-2]*(m-1);j++)

if (y[j]

for (int k=1;k<=m-y[j];k++)

if (y[j]+k

while (y[r]

連續郵資問題

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

連續郵資問題

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

連續郵資問題

連續郵資問題 演算法設計 該問題是設計最佳的郵票面值,用來表示最大的區間 對於連續郵姿問題,用n元組x 1 n 表示n種不同的郵票面值並約定它們從小到大排列。整數r表示當前使用不超過m張郵票能貼出的最大連續郵資區間。x 1 1是唯一的選擇。此時最大連續郵資區間是 1 m 接下來x 2 的可能取值範圍...