題目描述
整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。
輸入每組輸入是兩個整數n和k。(1 <= n <= 50, 1 <= k <= n)
輸出
對於輸入的 n,k;
第一行: 將n劃分成若干正整數之和的劃分數。
第二行: 將n劃分成k個正整數之和的劃分數。
第三行: 將n劃分成最大數不超過k的劃分數。
第四行: 將n劃分成若干個 奇正整數之和的劃分數。
第五行: 將n劃分成若干不同整數之和的劃分數。
第六行: 列印乙個空行
思路: 我們乙個乙個來看啊
(一)
將n劃分成若干個正整數之和:
我們設dp[i][j]表示的是,當前的數字是i,且最大的劃分是j的時候的劃分數
初始化:dp[1] = 1, dp[1] = 1 , 當乙個數的最大劃分是1的時候也就是他全部都是1,或者當前數字是1的時候只能由一種劃分
轉移方程:
dp[i][j] = dp[i][j-1] + dp[i-j][j](i>=j)
dp[i][j] = dp[i][i] (i
解釋一下這個轉移方程,當前數字為i最大劃分是j可以由當前數字為i最大劃分為j-1轉換過來,(4,3) ,, (4,2) ,是吧其實就是等於把那個大的在劃分一下,還可以由i-j 和 j轉移過來 (6,3) (9,3) ,其實就是前乙個狀態在加上乙個j得來的。大概就是這個意思把。
(二)
將n劃分成k個正整數之和的劃分數(這個其實就是給你n個蘋果和m個盤子而且盤子不能為空,問你最多有多少種分發)
我們設dp[i][j] 表示的是 當前還剩下n個蘋果和m個盤子的時候的最大值
狀態轉移方程:
dp[i][j] = dp[i-j][j] + dp[i-1][j-1] (i>=j)
解釋一下這個轉移方程,你剩下i個蘋果m個盤子的時候,那麼下一次你放的時候,可以在每個盤子裡都放乙個蘋果,他的轉移方程就是dp[i-j][i],當前剩下i-j個蘋果(因為每個盤子都放了乙個,總共有j個盤子,之後盤子數量還是那麼多)或者你只在乙個盤子裡面放乙個蘋果,之後就不管這個盤子了,那麼他是dp[i-1][j-1],放了乙個蘋果所以i-1 ,丟了乙個盤子j-1。
(三)
將n劃分成不超過k的最大劃分數
這個其實和第乙個是一樣的,狀態轉移方程也一樣,這是返回值不一樣而已,你仔細看看第乙個對於dp陣列的定義其實就是這個東西,不多說了好吧
(四)
將n劃分成為幾個奇正整數之和的劃分數
我們設dp[i][j] 表示的是i這個數劃分的最大值不超過k的時候的劃分數,其實和第乙個差不多就是這裡有乙個限制就是要是奇數
初始化:dp[1] = 1 ;
轉移方程:
當j為奇數的時候
dp[i][j] = dp[i-j][j] + dp[i][j-1];
dp[i][j] = dp[i][i];
當j為偶數的時候
dp[i][j] = dp[i][j-1]
解釋一下轉移方程,當他是奇數的時候,其實和第乙個是一樣的,但是只是奇數的時候才是一樣的,當他是偶數的時候,我們知道j-1 是奇數,所以他是由dp[i][j-1] 轉移過來的。
(五)將n劃分成幾個不相同的正整數之和。
我們設dp[i][j]表示的是n這個數劃分的最大值不超過k的劃分數
初始化:
dp[1] = 1; dp[1] = 1,當他的最大劃分為1的時候也就是說所有數都是1方案數是1,當他是1的時候,方案數也是1
轉移方程 :
dp[i][j] = dp[i-j][j-1] + dp[i][j-1] (i>=j)
dp[i][j] = dp[i][i] (i
解釋一下轉移方程,他說的是不能重複,所以當前數字是i,最大劃分為j的時候,可以劃分出乙個j,又因為他不能重複,所以只能劃分出乙個j,劃分完就不能用了,所以是dp[i-j][j-1](劃分完了),其他的都一樣,他可以把j在劃分乙個1
總結完了上**把(感覺自己的認知還是不深刻。。。要在看一下別人的部落格呢)
#include using namespace std;
#define mes(a) memset(a,0,sizeof(a));
int n,k;
int a()//將n劃分成若干正整數之和的劃分數
else
}} return dp[n][n];
}int b()//將n劃分成k個正整數之和的劃分數。
} return dp[n][k]; }
int c()//將n劃分成若干正整數之和的劃分數
else
}} return dp[n][k];
}int d()
} for(int i = 1 ; i < 55 ; i++)
else dp[i][j] = dp[i][i];
}else
}} return dp[n][n];
}int e()
else
}} return dp[n][n];
}int main()
}
NYOJ 571 整數劃分 三
描述 整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。輸入 每組輸入是兩個整數n和k。1 n 50,1 k n 輸出對於輸入的 n,k 第一行 將n劃分成若干正整數之和的劃分數。第二行 將n劃分成k個正整數之和的劃分數。第三行 將n劃分成最大數不超過k的劃分數。第四行 將n劃分成若干個 奇正整...
nyoj 571 整數劃分 三
時間限制 1000 ms 記憶體限制 65535 kb 難度 5描述 整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。輸入 多組輸入資料。每組輸入是兩個整數n和k。1 n 50,1 k n 輸出對於輸入的 n,k 第一行 將n劃分成若干正整數之和的劃分數。第二行 將n劃分成k個正整數之和的劃分...
NYOJ 571 整數劃分 三
第一行 將n劃分成若干正整數之和的劃分數。狀態轉移方程 dp i j 和為i 最大數不超過j的拆分數 dp i j 可以分為兩種情況 1 拆分項至少有乙個j 2 拆分項乙個j也沒有 dp i j dp i j j dp i j 1 第二行 將n劃分成k個正整數之和的劃分數。dp n k k 相當於把...