你的猜測是正確的。這是二維DP問題。但在我們宣佈我們需要達到遞推公式之前,我們會看到該公式中有多少個字段是變化的。
在您的問題陳述中有兩件事:1)郵票大小需要最小化。 2)所有的郵票應加起來總和P.如果你是初學者不認爲DP自下而上。首先考慮遞歸方法,經過一些練習後應該變得容易思考。在這種情況下,讓我們說你知道N個郵票的解決方案。讓我們用M(d(N),P)表示這種解決方案,它表示M是N個郵票中的總和爲P的解決方案。爲了得到遞歸關係,考慮如果最後一個郵票(Nth)不是結果的一部分,那麼問題將被縮小到找出N個N-1郵票中的P。如果存在最後一個元素(第N個郵票),問題是從N-1個郵票中找出P - d(N)總和。其中複發性關係看起來就像是:
M(N, P) = Min{ M(N-1, P), M(N-1, P - d(N))}
或更一般的意義:
M(i, P) = Min{ M(i - 1, P), M(i - 1, P - d(i))}
正如你可以看到兩個字段這個遞歸公式不同,因此你一定要認爲二維DP。
取兩軸,在X軸上取0到P所有總和,在y軸上取0到N(元素數)。迭代函數應該如下所示。
set all M(0, j) and M(i, 0) = 0 for all i [0, N] and j [0, P]
for: i = 0 to N
for: j = 0 to P
for: int k = 0 to j
if: j - P(k) >= 0 and M(i, j) < M(i-1, j-P(k))
M(i, j) = M(i-1, j-P(k));
return M(N, P);
注:因爲很明顯在併購這一領域將是一個需要最小化的選擇郵票大小我沒有提到的郵票大小。
非常感謝你也可以說算法的迭代版本?(這對我來說更容易理解)? –
@HamedMinaee查看我的編輯 –
謝謝我認爲遞歸關係是:min(i,j)= min {m(i-1,j),m(i,j-Pi)+ Si; if j> = pi)但是我不知道如何添加檢查總值的條件加起來就是p。你有什麼想法? –