揹包思想計算方案的總數(貨幣系統)

2021-10-21 00:13:23 字數 1142 閱讀 8279

問題:已知v種不同面值的硬幣,假設每種硬幣的數量無限,求支付n元有多少種不同的方案?

例:現在有3種貨幣:1元、2元、5元,需要向別人支付10元。

完全揹包思路:

從左到右依次考慮每種貨幣,有兩種操作:1.選   2.不選,同一種貨幣可以選擇多次。

令貨幣的價值=占用揹包的空間,支付總價錢作為揹包的容量,那麼揹包的容量等價於物品的價值,也就是我得到價值為k的物品,揹包容量就減少了k。

如果取得最大價值時,揹包恰好裝滿,就代表放進揹包的貨幣剛剛好能湊出支付的總價錢(容量為v的揹包能取得的最大價值也剛好是v)

如果取得最大價值時,揹包還沒有裝滿(但已經沒有最優方案了),這個時候放進揹包的貨幣湊不出支付的總價錢

dp設計思路:

考慮前 i 種貨幣恰好能支付 v 元的方案數量是 dp[ i ][ v ],現在有兩種方案,1、我選擇貨幣 i 作為方案

2、不選擇貨幣 i 作為方案 ,每種方案都對應著不同的狀態轉移

選擇用第 i 種貨幣支付,那麼支付方案數量 = dp[ i ][ v - w[i] ] (w[i] 是貨幣 i 的面值)

不選擇用第 i 種貨幣支付,那麼支付方案數量 = dp[ i-1 ][ v ] 

所以考慮前 i 種貨幣恰好能支付 v 元的方案數總數 = dp[ i ][ v - w[i] ] + dp[ i-1 ][ v ] 

選擇用第 i 種貨幣的時候,為什麼狀態轉移到dp[ i ][ v - w[i] ] 而不是 dp[ i-1 ][ v - w[i] ] 呢?

因為同一種貨幣可以選擇多次,選擇貨幣 i 後,雖然揹包容量變成了 v - w[i] ,但是依然可以考慮前 i 種貨幣,所以是dp[ i ][ v - w[i] ]

如果不選擇貨幣 i ,那麼揹包容量就不會變,但是我們可以的考慮的就只有前 i-1 種貨幣啦,所以是dp[ i-1 ][ v ] 

所以轉移公式: dp[i][v] = dp[ i ][ v-w[i] ] + dp[ i-1 ][ v ]

邊界:當只有一種貨幣的時候,也就只有一種方案,所以 dp[1][ v ] = 1

完全揹包求方案總數

給定乙個正整數n,求將其分解成若干個素數之和的方案總數。這題和p1164 小a點菜很像,但是那題是01揹包,這題是完全揹包。include include include include include define int long long using namespace std const i...

貨幣系統 (完全揹包)

首先我們要想到,最後的最小的貨幣系統應該是原貨幣系統的乙個子集,原因也很簡單 如果a能夠用其他乙個或若干個面值表示那麼它顯然不必要,而如果你去引入乙個原來不存在的數那麼要麼是多於的 能被原來貨幣系統裡面的乙個或多個數表達 要麼就會引入新的東西。所以現在我們要做到就是在剛剛的集合裡面求所有必要的無法被...

揹包問題之最優方案總數

此處的最優方案是指物品總價值最大的方案。這裡以0 1揹包問題為例。給定資料如下 c 2 3,4 5,6 7,8 v 3,4,5,6,7,8,9 v 23 結合求最大總價值和方案總數兩個問題的思路,最優方案的總數可採取如下方式求解 令 dp i j dp i j dp i j 表示前i件物品在代價為j...