動態規劃之自由組合問題

2021-10-02 15:27:50 字數 938 閱讀 9453

1.有一定的錢,去買一些東西,求最多有多少買種東西的方案?

2.如果一種物品最多能買一次,則是01揹包變形型別

3.如果乙個物品能多次購買,則是完全揹包變形型別

4.每一種買東西的方案必須要把錢剛好花完。

1.    神奇的口袋

2.   買書

第一道題裡「錢」是固定的,輸入「東西的**」;第二道題裡「東西的**」是固定的,輸入「錢」。雖然輸入的東西不一樣,但是這一點是類似的,因為遍歷時每一種情況都會遍歷。

這題不同的地方是前者每個物品最多用一次,後者一種書可以多次購買,乙個是01揹包的變形,乙個是完全揹包的變形。

第一題**:

//神奇的口袋

#includeusing namespace std;

int main()

; cin>>n;

dp[0]=1;

for(i=1;i<=n;i++)

cin>>a[i];

for(i=1;i<=n;i++) }

cout《第二題**:

//買書

#include using namespace std;

int w[4] = ;

int main()

; dp[0] = 1;

for (int i = 0; i < 4; i++)

for (int j = n; j >= w[i]; j-- )

dp[j] += dp[j-w[i]];

cout<分析:

1.上面這兩個**都很簡單,最關鍵的地方是動態轉移方程dp[j]=dp[j]+dp[j-a[i]];

2.對於這一類的題,這個動態轉移方程都適用

動態規劃之硬幣組合問題

問題 如果我們有面值為1元 3元和5元的硬幣若干枚,如何用最少的硬幣湊夠11元?動態規劃的本質是將原問題分解為同性質的若干相同子結構,在求解最優值的過程中將子結構的最優值記錄到乙個表中以避免有時會有大量的重複計算。例如硬幣組合問題,若求湊夠11元的最少硬幣數,可以先從湊夠0元 1元 2元 的子結構開...

動態規劃問題之求組合數

我們知道,組合數在組合數學中非常有用,組合數是乙個十分常用的數字。比如,書架上有4本書abcd,我們想拿2本讀,那麼有c 4,2 種方法。這個數字的求法是 4!2!4 2 其中n!1 2 3.n,是階乘數。所以按定義求其實也十分 容易 這裡是指容易寫罷了。先求乙個階乘 def fac n if n ...

硬幣組合問題 動態規劃

如果我們有面值為1元 3元和5元的硬幣若干枚,如何用最少的硬幣湊夠11元?表面上這道題可以用貪心演算法,但貪心演算法無法保證可以求出解,比如1元換成2元的時候 首先我們思考乙個問題,如何用最少的硬幣湊夠i元 i 11 當i 0,即我們需要多少個硬幣來湊夠0元。由於1,3,5都大於0,即沒有比0小的幣...