3002 整數劃分

2021-10-05 23:20:58 字數 2503 閱讀 6711

將n分為若干個不同整數的和,有多少種不同的劃分方式,例如:n = 6, ,共4種。由於資料較大,輸出mod 10^9+7的結果即可。

收起

輸入1個數n(1 <= n <= 1000)。
輸出劃分的數量mod 10^9 + 7。
對於10%的資料,1≤n≤10;

對於40%的資料,1≤n≤100;

對於100%的資料,1≤n≤2000;

6
4
題解:

經典整數劃分問題,屬於動態規劃。維護dp[i][j]為對i進行不大於j的整數劃分數。

(1) 當i(2) 當i>j時,可以根據劃分中是否含有j分為兩種情況。若劃分中含有j,則其餘的劃分中最大只能是j-1,方案數為dp[i-j][j-1];若劃分中不含j,相當於將i劃分為不大於j-1的劃分數,為dp[i][j-1]。所以當i>j時dp[i][j]=dp[i-j][j-1]+dp[i][j-1];

(3) 當i=j時,若劃分中含有j只有一種情況,若劃分中不含j相當於將i劃分為不大於j-1的劃分數。此時dp[i][j]=1+dp[i][j-1]

#include#include#include#includeusing namespace std;

const int mod = 1e9+7;

int main()

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

else}}

printf("%d\n",dp[n][n]);

return 0;

}

另外看到網上有大牛整理的詳細整數劃分問題解決方法:

這裡也轉錄一下,留作參考。

劃分成若干正整數之和

劃分成k個正整數之和的劃分

劃分成最大數不超過k的劃分

劃分成若干 奇正整數之和的劃分

劃分成若干不同整數之和的劃分

劃分成若干正整數之和(解決問題1和3)

設dp[i][j]為將i劃分為不大於j的劃分數

(1) 當i(2) 當i>j 時,可以根據劃分中是否含有j分為兩種情況。若劃分中含有j,劃分方案數為dp[i-j][j];若劃分數中不含j,相當於將i劃分為不大於j-1的劃分數,為dp[i][j-1]。所以當i>j時dp[i][j]=dp[i-j][j]+dp[i][j-1];

(3) 當i=j 時,若劃分中含有j只有一種情況,若劃分中不含j相當於將i劃分為不大於j-1的劃分數。此時dp[i][j]=1+dp[i][j-1]。

dp[n][n]可以解決問題1,dp[n][k]表示將n劃分為最大數不超過k的劃分數,可以解決問題3。

若劃分的正整數必須不同(解決問題5)

設dp[i][j]為將i劃分為不超過j的不同整數的劃分數

(1) 當i(2) 當i>j時,可以根據劃分中是否含有j分為兩種情況。若劃分中含有j,則其餘的劃分中最大只能是j-1,方案數為dp[i-j][j-1];若劃分中不含j,相當於將i劃分為不大於j-1的劃分數,為dp[i][j-1]。所以當i>j時dp[i][j]=dp[i-j][j-1]+dp[i][j-1];

(3) 當i=j時,若劃分中含有j只有一種情況,若劃分中不含j相當於將i劃分為不大於j-1的劃分數。此時dp[i][j]=1+dp[i][j-1]

dp[n][n]表示將n劃分為不同整數的劃分數,可以解決問題5.

將n劃分為k個整數的劃分數(問題2)

設dp[i][j]為將i劃分為j個整數的劃分數。

(1) i(2) 若i=j,有一種情況:i可以劃分為i個1之和,dp[i][j]=1;

(3) 若i>j,可以根據劃分數中是否含有1分為兩類:若劃分數中含有1,可以使用「截邊法」將j個劃分分別截去乙個1,把問題轉化為i-j的j-1個劃分數,為dp[i-j][j-1]; 若劃分中不包含1,使用「截邊法」將j個劃分數的最下面乙個數截去,將為題轉化為求i-j的j個劃分數,為dp[i-j][j]。所以i>j時dp[i][j]=dp[i-j][j-1]+dp[i-j][j]。

dp[n][k]為將n劃分為k個整數的劃分數,可解決問題2。

將n劃分為若干正奇數之和的劃分數(問題四)

設f[i][j]為將i劃分為j個奇數之和的劃分數,g[i][j]為將i劃分為j個偶數之和的劃分數。

使用截邊法,將g[i][j]的j個劃分都去掉1,可以得到f[i-j][j],所以

g[i][j] = f[i-j][j]。

f[i][j]中有包含1的劃分方案和不包含1的劃分方案。對於包含1的劃分方案,可以將1的劃分除去,轉化為「將i-1劃分為j-1個奇數之和的劃分數」,即f[i-1][j-1];對於不包含1的劃分方案,可以使用截邊法對j個劃分每乙個都去掉乙個1,轉化為「將i-j劃分為j個偶數之和的劃分數」,即g[i-j][j]。

所以f[i][j]=f[i-1][j-1]+g[i-j][j]。

f[n][0]+f[n][1]+……+f[n][n]為將n劃分為若干奇數的劃分數,為問題4的答案。

BLMOOC3002簡單的整數劃分問題

總時間限制 100ms 記憶體限制 65536kb 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。輸入 標準的輸入包含若干組測試資料。每組測試資料是乙個整數...

整數劃分(劃分dp)總結

寫了幾個題發現整數劃分是一類題,而不是一道題。具體題型 1 n相同元素放入m個相同的盤子 盤子允許為空 例題 放蘋果 poj 1664設dp i j 為 j 個元素放入i個盤子轉移方程 dp i j dp i 1 j 新新增乙個盤子,盤子為空 dp i j dp i j i i個盤子 各取出乙個 2...

整數劃分問題

整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為 1 我們該如何找出所有的劃分呢?我們可以先來看看整數劃分的規律 譬如正整數 6 劃分情況如下 6 5 14 2 4 1 1 3 3 3 2...