動態規劃 揹包 整數劃分的5種情況

2021-07-27 22:29:19 字數 2754 閱讀 8241

1.將n劃分成若干正整數之和的劃分數(可以存在相同整數)。

轉移方程如下:

dp[n][m]=dp[n][m-1]+ dp[n-m][m]  dp[n][m]表示整數 n 的劃分中,每個數不大於 m 的劃分數。

理解①:

根據劃分中包不包含m的情況分為2種,一種情況是劃分中包含m,則剩下數的總和剩下n-m,相當於其劃分數為dp[n-m][m]。另一種情況是劃分中不包含m,那麼其劃分數為dp[n][m-1]。

**:

dp[0][0]=1;  

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

}cout<

理解②:

也可以看成完全揹包問題,有1到n個揹包,第i個揹包的重量為i,價值為i。dp[j] 是用前 i 個數能構成 j 的種類數

**:

dp[0] = 1;

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

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

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

2、將n劃分成若干不同正整數之和的劃分數(不可以存在相同整數)

轉移方程如下:

dp[n][m]=dp[n][m-1]+ dp[n-m][m-1]   dp[n][m]表示整數 n 的劃分中,每個數不大於 m 的劃分數。

理解①:

根據劃分中包不包含m的情況分為2種,一種情況是劃分中包含m,則剩下數的總和剩下n-m,相當於其劃分數為dp[n-m][m-1]。(跟1的情況的區別就在這裡,因為不能重複,所以應該是m-1)另一種情況是劃分中不包含m,那麼其劃分數為dp[n][m-1]。

**:

dp[0][0]=1;  

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

} cout<

理解②:

由於每個數最多只能取1次,是經典的01揹包,**如下

**:

dp[0]= 1;

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

for(j = n;j >= i ;j--)

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

3、將n劃分為k個數的劃分數。

轉移方程

dp[n][k]= dp[n-k][k]+ dp[n-1][k-1];

理解

根據劃分中包不包含1的情況分為2種,如果不包含1,即所有數都大於等於2,我們可以取出n個1分到每乙份(總共k份)上去,再將剩下的n-k個1分成k份,總共有dp[n-k][k]種分法。如果包含1,我們把那份單獨的1取出來,總和就剩下n-1,數也剩下k-1個,即有dp[n-1][k-1]種分法。

**:

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

for (int j=1;j<=i;j++)

4、將n分成最大數不超過k的劃分數

轉移及思路同1,方程最後的輸出為dp[n][k];如果看成揹包問題,即是用前k個揹包來裝結果,將第一層迴圈改為i<=k即可。

5、將n劃分為若干奇數的方法

轉移方程

g[i][j] =f[i - j][j];f[i][j] = f[i - 1][j - 1] + g[i - j][j];g[i][j]:將i劃分為j個偶數;f[i][j]:將i劃分為j個奇數

思路

對於g[i][j]= f[i- j][j],從i中拿出j個1到每乙份中,則剩下的數總和為i-j也必須為奇數,i-j分成j個奇數,所以劃分數為f[i-j][j]。

對於f[i][j] = f[i- 1][j - 1] + g[i - j][j],如果不包含1,每份都大於等於2,將j個1拿出來分到每乙份中,剩下的i-j必須劃分為j份偶數,即g[i-j][j]。如果包含1,將那份1拿出來,剩餘的i-1分成j-1個奇數,即f[i-1][j-1]。

**:

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

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

else //相當於上面思路中的g[i][j]

dp[i][j]=dp[i][j-1];

} }

揹包思路

因為只能是奇數,所以偶數的揹包種類(i=2,4,6,8……)不符合要求,i++改為i+=2即可

**:

dp[0] = 1;

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

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

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

動態規劃 分組揹包

問題 有n件物品,告訴你這n件物品的重量以及價值,將這些物品劃分為k組,每組中的物品互相衝突,最多選一件,求解將哪些物品裝入揹包可使這些物品的費用綜合不超過揹包的容量,且價值總和最大。演算法 首先判斷乙個分組當中的一件物品,同01揹包一樣,此物品存在兩種狀態,取與不取,若取此物品,則繼續判斷下一組的...

集合劃分問題 Golang 動態規劃 01揹包

最長等差數列問題 golang 暴力法 字母組合 golang 驗證ip位址 golang 01揹包問題,用乙個set記錄可能湊出來的值。超過所有數字之和的一半可以不用記錄,因為必定有乙個小於一半的互補的情況,可以得出一組最接近總和一半的值max maxma x,總和sum max sum max ...

動態規劃的01揹包

特點是 每種物品僅有一件,可以選擇放或不 放。用子問題定義狀態 即 f i,v 表示前 i 件物品恰放入乙個容量為 v 的揹包可 以獲得的最大價值。則其狀態轉移方程便是 f i,v max 杭電2602題 傳送門 杭電2602題 坑點 1 5 02 4 1 5 1 0 0 1 0 0 答案是12 過...