转载 - 整数划分问题
出處:?http://www.cnblogs.com/wanghetao/archive/2013/11/25/3442192.html
整數(shù)劃分 --- 一個老生長談的問題:
描述整數(shù)劃分是一個經(jīng)典的問題。請寫一個程序,完成以下要求。
?
?
輸入第一行: 將n劃分成若干正整數(shù)之和的劃分數(shù)。
第二行: 將n劃分成k個正整數(shù)之和的劃分數(shù)。
第三行: 將n劃分成最大數(shù)不超過k的劃分數(shù)。
第四行: 將n劃分成若干個 奇正整數(shù)之和的劃分數(shù)。
第五行: 將n劃分成若干不同整數(shù)之和的劃分數(shù)。
第六行: 打印一個空行
1.將5劃分成若干正整數(shù)之和的劃分為: 5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
2.將5劃分成2個正整數(shù)之和的劃分為: 3+2, 4+1
3.將5劃分成最大數(shù)不超過2的劃分為: 1+1+1+1+1, 1+1+1+2, 1+2+2
4.將5劃分成若干 奇正整數(shù)之和的劃分為: 5, 1+1+3, 1+1+1+1+1
5.將5劃分成若干不同整數(shù)之和的劃分為: 5, 1+4, 2+3
?
?
下面是我根據(jù)網(wǎng)上的資料, 寫出自己的分析和實現(xiàn)過程.
分析:
?
本題使用動態(tài)規(guī)劃(Dynamic Programming)方法解決
一 求將n劃分為若干正整數(shù)之和的劃分數(shù)
?
1.?若劃分的多個整數(shù)可以相同
設dp[i][j]為將i劃分為不大于j的劃分數(shù)
(1) 當i<j?時,i不能劃分為大于i的數(shù),所以dp[i][j]=dp[i][i];
(2) 當i>j?時,可以根據(jù)劃分中是否含有j分為兩種情況。若劃分中含有j,劃分方案數(shù)為dp[i-j][j];若劃分數(shù)中不含j,相當于將i劃分為不大于j-1的劃分數(shù),為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的劃分數(shù)。此時dp[i][j]=1+dp[i][j-1]。
dp[n][n]可以解決問題1,dp[n][k]表示將n劃分為最大數(shù)不超過k的劃分數(shù),可以解決問題3。
?
2.?若劃分的正整數(shù)必須不同
設dp[i][j]為將i劃分為不超過j的不同整數(shù)的劃分數(shù)
(1) 當i<j時,i不能劃分為大于i的數(shù),所以dp[i][j]=dp[i][i];
(2) 當i>j時,可以根據(jù)劃分中是否含有j分為兩種情況。若劃分中含有j,則其余的劃分中最大只能是j-1,方案數(shù)為dp[i-j][j-1];若劃分中不含j,相當于將i劃分為不大于j-1的劃分數(shù),為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的劃分數(shù)。此時dp[i][j]=1+dp[i][j-1]
?
dp[n][n]表示將n劃分為不同整數(shù)的劃分數(shù),可以解決問題5.
?
二 將n劃分為k個整數(shù)的劃分數(shù)
設dp[i][j]為將i劃分為j個整數(shù)的劃分數(shù)。
(1)?i<j為不可能出現(xiàn)的情況,dp[i][j]=0;
(2) 若i=j,有一種情況:i可以劃分為i個1之和,dp[i][j]=1;
(3) 若i>j,可以根據(jù)劃分數(shù)中是否含有1分為兩類:若劃分數(shù)中含有1,可以使用“截邊法”將j個劃分分別截去一個1,把問題轉(zhuǎn)化為i-j的j-1個劃分數(shù),為dp[i-j][j-1];?若劃分中不包含1,使用“截邊法”將j個劃分數(shù)的最下面一個數(shù)截去,將為題轉(zhuǎn)化為求i-j的j個劃分數(shù),為dp[i-j][j]。所以i>j時dp[i][j]=dp[i-j][j-1]+dp[i-j][j]。
?
dp[n][k]為將n劃分為k個整數(shù)的劃分數(shù),可解決問題2。
?
?
三 將n劃分為若干正奇數(shù)之和的劃分數(shù)
?
設f[i][j]為將i劃分為j個奇數(shù)之和的劃分數(shù),g[i][j]為將i劃分為j個偶數(shù)之和的劃分數(shù)。
使用截邊法,將g[i][j]的j個劃分都去掉1,可以得到f[i-j][j],所以
g[i][j] = f[i-j][j]。
f[i][j]中有包含1的劃分方案和不包含1的劃分方案。對于包含1的劃分方案,可以將1的劃分除去,轉(zhuǎn)化為“將i-1劃分為j-1個奇數(shù)之和的劃分數(shù)”,即f[i-1][j-1];對于不包含1的劃分方案,可以使用截邊法對j個劃分每一個都去掉一個1,轉(zhuǎn)化為“將i-j劃分為j個偶數(shù)之和的劃分數(shù)”,即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劃分為若干奇數(shù)的劃分數(shù),為問題4的答案。
?
參考: [1]??http://blog.csdn.net/a83610312/article/details/12685653
???????? [2]??http://www.cnblogs.com/jackge/p/3163835.html
轉(zhuǎn)載于:https://www.cnblogs.com/sineatos/p/4089167.html
總結
以上是生活随笔為你收集整理的转载 - 整数划分问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#调用SQL中的存储过程中有outpu
- 下一篇: How to remove replic