NYOJ 整數劃分 三 劃分數大集合

2021-08-17 17:44:40 字數 2731 閱讀 7622

題目描述

整數劃分是乙個經典的問題。請寫乙個程式,完成以下要求。

輸入每組輸入是兩個整數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 相當於把...