整數劃分問題 dp 動態規劃

2021-08-18 01:21:23 字數 2507 閱讀 2323

原文:

假設我們有乙個整數n,我們要對它在約束條件不同的情況下進行劃分。

1.把n劃分成不小於m(且為正整數)的劃分數

2.把n劃分成為k個正整數的劃分數

3.把n劃分成k個奇數的劃分數

1.把n劃分成不小於m(且為正整數)的劃分數

—————————————————————————————————————————————

狀態dp[i][j]代表把i劃分為不小於j的劃分數。

1.把n劃分為不小於m但可以存在相同數時的劃分數

這種情況的劃分數的方案可以分為兩類1.不包括m

2.至少包括乙個m;

第一類:dp[n][m-1],我們可以看做把n劃分為小於m的劃分數,就能保證不包括m;

第二類:dp[n-m][m], 我們可以看做把對n去掉m後的數,進行不小於m的劃分,就能保證至少包括乙個m;

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

2.把n劃分為不小於m,且每個人數都不相同時的劃分數

這種情況的劃分數的方案可以分為兩類1.不包括m

2.只有乙個m

第一類:dp[n][m-1],我們可以看做把n劃分為小於m的劃分數,就能保證不包括m;

第二類:dp[n-m][m-1], 我們可以看做把對n去掉m後的數,進行小於m的劃分,就能保證只包括乙個m;

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

—————————————————————————————————————————————

2.把n劃分為k個正整數的劃分數

—————————————————————————————————————————————

狀態dp[i][j] 為把i劃分為j個正整數的劃分數

1.把n劃分為k個可以相等的數的劃分數

這種情況可以分為兩類1.至少乙個1

2.乙個1也沒有(也可以看做都是》=2)

第一類:dp[n-1][k-1],我們可以先拿出乙個1分配到其中乙份,接著將剩下的n-1分配到k-1份上,就能保證

至少乙個1;

第二類:dp[n-k][k],我們可以先拿出k個1平均分配到k份(這個保證了每個都為1),接著將剩下n-k分配到

k份(保證每份中至少分配到1),就能保證k份中乙個1也沒有。(因為1加上乙個大於等於1的數

一定》=2)。

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

2.把n劃分為k個不相等的數的劃分數

這種情況可以分為兩類1.只有乙個1

2.乙個1也沒有(也可以看做都是》=2)

第一類:dp[n-k][k-1],我們可以先拿出k個1平均分配到k份(這個保證了每個都為1),接著將剩下n-k分配

到k-1份(保證除了乙份有1外,其他的都》=2),就能保證k份中除了乙份有1其它的都》=1(只有一

個1);

第二類:dp[n-k][k],我們可以先拿出k個1平均分配到k份(這個保證了每個都為1),接著將剩下n-k分配到

k份(保證每份中至少分配到1),就能保證k份中乙個1也沒有。(因為1加上乙個大於等於1的數一

定》=2)。

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

—————————————————————————————————————————————

3.把n劃分為k個奇數的劃分數

—————————————————————————————————————————————

dp[i][j]為把i劃分為j個奇數的劃分數

1.把n劃分為k個可以相同的奇數的劃分數

這種情況可以分為兩類1.至少乙個1

2.乙個1也沒有(也可以看做》=3,因為必須是奇數)

第一類:dp[n-1][k-1],我們可以先拿出乙個1分配到其中乙份,接著將剩下的n-1分配到k-1份上,就能保證

至少乙個1;

第二類:dp[n-2*k][k],我們可以先拿出k個2分配到其中的k份,接下來的n-2*k分配到k份中(這樣就保證了

每份都》=3,也就是乙個1也沒有);

dp[i][j]=dp[i-1][j-1]+dp[i-2*k][k];

2.把n劃分為k個不相同的奇數的劃分數

這種情況可以分為兩類1.只有乙個1

2.乙個1也沒有(也可以看做》=3,因為必須是奇數)

第一類:dp[i-2*k+1][k-1],dp[i-2*k+1][k-1]可以看做dp[i-2*(k-1)-1][k-1],我們可以拿出(k-1)個2平均分配

(k-1)份上,然後拿出乙個1分配到不為2的那乙份上。接下來將i-2*(k-1)-1分配到都為2的(k-1)份上

這樣就保證了這k-1份都》=3;

第二類:dp[n-2*k][k],我們可以先拿出k個2分配到其中的k份,接下來的n-2*k分配到k份中(這樣就保證了

每份都》=3,也就是乙個1也沒有);

dp[i][j]=dp[i-2*k+1][k-1]+dp[i-2*k][k];

—————————————————————————————————————————————

DP 動態規劃 整數劃分

時間限制 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的這種表示稱為...

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

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

整數劃分問題 動態規劃

原文出處 整數劃分 有以下情況 1 將n劃分成若干正整數之和的劃分數。2 將n劃分成k個正整數之和的劃分數。3 將n劃分成最大數不超過k的劃分數。4 將n劃分成若干奇正整數之和的劃分數。5 將n劃分成若干不同整數之和的劃分數。include includeconst int ns 55 int n,...