DP 動態規劃 整數劃分

2021-08-31 07:28:25 字數 1266 閱讀 6019

時間限制:3000 ms  |  記憶體限制:65535 kb

難度:3

輸入第一行是測試資料的數目m(1<=m<=10)。以下每行均包含乙個整數n(1<=n<=10)。

輸出輸出每組測試資料有多少種分法。

描述將正整數n表示成一系列正整數之和:n=n1+n2+…+nk, 

其中n1≥n2≥…≥nk≥1,k≥1。 

正整數n的這種表示稱為正整數n的劃分。求正整數n的不 

同劃分個數。 

例如正整數6有如下11種不同的劃分: 

6; 5+1; 

4+2,4+1+1; 

3+3,3+2+1,3+1+1+1; 

2+2+2,2+2+1+1,2+1+1+1+1; 

1+1+1+1+1+1。 

#include using namespace std;

int cnt,n;

int memo[11][11];

void init();

int dp(int n, int m);

int main()

else if(m==n)

else

}

【2018/11/8後記】

1.本題用了動態規劃法+備忘錄法,遞迴公式如下:

其中q(n,m)代表:要劃分的整數為n,最大的加數<=m

如:q(3,2)代表:將3進行劃分,最大的加數不能超過2,因此只有2+1,1+1+1這兩種分法,因此q(3,2)=2

n和m的值有以下幾種情況:

第一種情況:當n==1時,即要劃分的整數為1,自然只有一種分法;當m==1時,n只能被劃分成n個1相加,也只有一種分法

第二種情況:當n第三種情況:當n=m時,我們可以將其分成兩種子情況:

①子情況:讓最大的加數=m,那麼分法只有1種:n=m

②子情況:讓最大的加數<=m-1,那麼問題轉換成q(n,m-1),因為m=n,所以q(n,m-1)=q(n,n-1)

所以,第三種情況的分法q(n,m)=1+q(n,n-1)

第四種情況:當n>m時,我們可以將其分成兩種子情況:

①子情況:讓最大的加數=m,那麼問題轉換成q(n-m,m)

②子情況:讓最大的加數所以,第四種情況的分法q(n,m)=q(n-m,m)+q(n,m-1)

詳細講解請轉這篇部落格:

2、這道題跟裝盤子那道差不多了 ,都是要分子情況

整數劃分 劃分數(DP動態規劃)

給你乙個正整數n,讓你計算出n的m劃分有幾種方法。思路 定義dp i j 為i的j劃分,即將i劃分為j個數字之和的方案數。1 當j i時,此時,劃分個數不超過i,此時是正常的劃分。劃分的結果一定只有兩種型別 一種是j個數字,都大於0。另一種是有0,即不夠劃分j個,用0來湊的。j個數字中存在0的,其實...

整數劃分問題 dp 動態規劃

原文 假設我們有乙個整數n,我們要對它在約束條件不同的情況下進行劃分。1.把n劃分成不小於m 且為正整數 的劃分數 2.把n劃分成為k個正整數的劃分數 3.把n劃分成k個奇數的劃分數 1.把n劃分成不小於m 且為正整數 的劃分數 狀態dp i j 代表把i劃分為不小於j的劃分數。1.把n劃分為不小於...

動態規劃解整數劃分

演算法思路 n n1 n2 n3 n4 nk n1 n2 n3 nk 從大到小排列後,可以避免陷入數值大小排序順序的困境中。這樣,在下面的過程,我們可以並不關心數值大小的排列,只關心組合方案數。狀態表示 將最大加數n1不大於m的劃分個數記作q n,m 狀態轉移 1 q n,1 1,n 1 當最大加數...