の値があり、ドル紙幣を使用N
して合計する方法がいくつあるかを計算する必要がある問題を考えてみましょう。N
[1,2,5,10,20,50,100]
従来の DP ソリューションを検討してください。
C = [1,2,5,10,20,50,100]
def comb(p):
if p==0:
return 1
c = 0
for x in C:
if x <= p:
c += comb(p-x)
return c
合計された部分の順序は有効になりません。たとえば、comb(4)
5 つの結果が得られます[1,1,1,1],[2,1,1],[1,2,1],[1,1,2],[2,2]
が、実際には 3 つ[2,1,1],[1,2,1],[1,1,2]
の結果があります (すべて同じです)。
この問題を計算するための DP イディオムは何ですか? (すべての可能なソリューションを生成し、重複を削除するなどの非エレガントなソリューションは歓迎されません)