演算法經典問題整數劃分問題詳解

2021-09-16 14:18:54 字數 2174 閱讀 3556

將正整數劃分為若干個正整數之和,有多少種劃分方法

設dp[i][j]為將i劃分為不大於j的劃分數,所求答案為dp[n][n]

(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]。

實現的時候直接兩重迴圈都從1到n,然後通過if條件自動判斷,不需要手動判斷,函式如下

可以去測試一下

void fun(vector> &dp, int n, int m) 

if (i > j)

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

} }}

2.若劃分的正整數必須不同

設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[0][0]=1 這個條件 

void fun2(vector> &dp, int n, int m) 

} dp[0][0] = 1;

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

}}

3.n劃分成若干個奇正整數之和的劃分數目

1)j為偶數(j%2==0),dp[i][j]=dp[i][j-1]; 往後遞推,其餘情況與允許相同,**

void fun3(vector> &dp, int n, int m) 

} dp[0][0] = 1;

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

}}

1、n劃分成k個正整數之和的劃分數目

dp[n][k]表示將n劃分為k個正整數之和

1)k個正整數中至少有一項為1,則去除1後求dp[i-1][j-1]

2)k個正整數中沒有1,則把每個數-1,求dp[i-j][j]

void fun4(vector> &dp, int n, int m) 

} dp[0][0] = 1;

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

}}

完整程式

#include #include using namespace std;

void fun1(vector> &dp, int n, int m)

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

if (i > j)

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

} }}void fun2(vector> &dp, int n, int m)

} dp[0][0] = 1;

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

void fun3(vector> &dp, int n, int m)

} dp[0][0] = 1;

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

void fun4(vector> &dp, int n, int m)

} dp[0][0] = 1;

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

int main()

//cin >> n >> m;

}

經典遞迴問題 整數劃分問題

題目 將乙個正整數n表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1,k 1 正整數n的乙個這種表示稱為正整數n的乙個劃分。正整數n的不同劃分個數稱為正整數n的劃分數,記做p n 如正整數6有如下11種不同的劃分,所以p 6 11。6 5 1 4 2,4 1 1 3 3,3 2...

整數劃分問題 經典DP

相關題目1 相關題目2 相關題目3 下面的描述大部分借鑑於 感謝,但是其中有部分錯誤,我會在下面的描述中糾正過來 總的解決方法時截邊法,也就是去討論有1無1的情況和截去他們的情況 記住了.1.若劃分的多個整數可以相同 設dp i j 為將i劃分為不大於j的劃分數 1 當i j 時,i不能劃分為大於i...

整數劃分問題 演算法

在遞迴裡,要對形參進行判斷 1 當n 1時 q 1,m 表示是對1的劃分,那麼只有一種劃分方式 1 2 當m 1時q n,1 當m 1時其實就是把讓所有加數小於等於1,那就是所有加數都是1咯 不考慮負數 當然也只有一種劃分方式 3 當n m時q n,n 此時就是對n的劃分出來的數沒有限制,預設限制就...