時間限制:3000 ms | 記憶體限制:65535 kb
難度:3
輸入第一行是測試資料的數目m(1<=m<=10)。以下每行均包含乙個整數n(1<=n<=10)。
輸出輸出每組測試資料有多少種分法。
描述將正整數n表示成一系列正整數之和:n=n1+n2+…+nk,
其中n1≥n2≥…≥nk≥1,k≥1。
正整數n的這種表示稱為正整數n的劃分。求正整數n的不
同劃分個數。
例如正整數6有如下11種不同的劃分:
6; 5+1;
4+2,4+1+1;
3+3,3+2+1,3+1+1+1;
2+2+2,2+2+1+1,2+1+1+1+1;
1+1+1+1+1+1。
#include using namespace std;
int cnt,n;
int memo[11][11];
void init();
int dp(int n, int m);
int main()
else if(m==n)
else
}
【2018/11/8後記】
1.本題用了動態規劃法+備忘錄法,遞迴公式如下:
其中q(n,m)代表:要劃分的整數為n,最大的加數<=m
如:q(3,2)代表:將3進行劃分,最大的加數不能超過2,因此只有2+1,1+1+1這兩種分法,因此q(3,2)=2
n和m的值有以下幾種情況:
第一種情況:當n==1時,即要劃分的整數為1,自然只有一種分法;當m==1時,n只能被劃分成n個1相加,也只有一種分法
第二種情況:當n第三種情況:當n=m時,我們可以將其分成兩種子情況:
①子情況:讓最大的加數=m,那麼分法只有1種:n=m
②子情況:讓最大的加數<=m-1,那麼問題轉換成q(n,m-1),因為m=n,所以q(n,m-1)=q(n,n-1)
所以,第三種情況的分法q(n,m)=1+q(n,n-1)
第四種情況:當n>m時,我們可以將其分成兩種子情況:
①子情況:讓最大的加數=m,那麼問題轉換成q(n-m,m)
②子情況:讓最大的加數所以,第四種情況的分法q(n,m)=q(n-m,m)+q(n,m-1)
詳細講解請轉這篇部落格:
2、這道題跟裝盤子那道差不多了 ,都是要分子情況
整數劃分 劃分數(DP動態規劃)
給你乙個正整數n,讓你計算出n的m劃分有幾種方法。思路 定義dp i j 為i的j劃分,即將i劃分為j個數字之和的方案數。1 當j i時,此時,劃分個數不超過i,此時是正常的劃分。劃分的結果一定只有兩種型別 一種是j個數字,都大於0。另一種是有0,即不夠劃分j個,用0來湊的。j個數字中存在0的,其實...
整數劃分問題 dp 動態規劃
原文 假設我們有乙個整數n,我們要對它在約束條件不同的情況下進行劃分。1.把n劃分成不小於m 且為正整數 的劃分數 2.把n劃分成為k個正整數的劃分數 3.把n劃分成k個奇數的劃分數 1.把n劃分成不小於m 且為正整數 的劃分數 狀態dp i j 代表把i劃分為不小於j的劃分數。1.把n劃分為不小於...
動態規劃解整數劃分
演算法思路 n n1 n2 n3 n4 nk n1 n2 n3 nk 從大到小排列後,可以避免陷入數值大小排序順序的困境中。這樣,在下面的過程,我們可以並不關心數值大小的排列,只關心組合方案數。狀態表示 將最大加數n1不大於m的劃分個數記作q n,m 狀態轉移 1 q n,1 1,n 1 當最大加數...