將正整數劃分為若干個正整數之和,有多少種劃分方法
設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的劃分出來的數沒有限制,預設限制就...