時間限制:3000 ms | 記憶體限制:65535 kb
難度:3
輸入第一行是測試資料的數目m(1<=m<=10)。以下每行均包含乙個整數n(1<=n<=10)。
輸出輸出每組測試資料有多少種分法。
樣例輸入
1樣例輸出6
11描述
將正整數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。
分析:是指把乙個正整數n寫成如下形式:
n=m1+m2+...+mi; (其中mi為正整數,並且1 <= mi <= n),則為n的乙個劃分。
如果中的最大值不超過m,即max(m1,m2,...,mi)<=m,則稱它屬於n的乙個m劃分。這裡我們記n的m劃分的個數為f(n,m);
例如但n=4時,他有5個劃分,,,,,;
注意4=1+3 和 4=3+1被認為是同乙個劃分。
該問題是求出n的所有劃分個數,即f(n, n)。
下面我們考慮求f(n,m)的方法;
根據n和m的關係,考慮以下幾種情況:
(1)當 n = 1 時,不論m的值為多少(m > 0 ),只有一種劃分即 ;
(2)當 m = 1 時,不論n的值為多少,只有一種劃分即 n 個 1,;
(3)當 n = m 時,根據劃分中是否包含 n,可以分為兩種情況:
(a). 劃分中包含n的情況,只有乙個即
(b). 劃分中不包含n的情況,這時劃分中最大的數字也一定比 n 小,即 n 的所有 ( n - 1 ) 劃分。
因此 f(n, n) = 1 + f(n, n-1);
(4) 當 n < m 時,由於劃分中不可能出現負數,因此就相當於 f(n, n);
(5) 但 n > m 時,根據劃分中是否包含最大值 m,可以分為兩種情況:
(a). 劃分中包含 m 的情況,即 }, 其中 的和為 n - m,可能再次出現 m,因此是(n - m)的 m 劃分,因此這種劃分個數為 f(n-m, m);
(b). 劃分中不包含 m 的情況,則劃分中所有值都比 m 小,即 n 的 ( m - 1 ) 劃分,個數為 f(n, m - 1);
因此 f(n, m) = f(n - m, m) + f(n, m - 1);
我的**如下:
#include#include#includeusing namespace std;
int solve(int n,int m)
}int main()
return 0;
}
測試資料整數搜尋 Ny 90 整數劃分
在改章節中,我們主要介紹測試資料整數的內容,自我感覺有個不錯的建議和大家分享下 1 目題整數分別 時光制限 3000 ms 存內制限 65535kb 難度 3 描述 將正整數 n表現成一系列正整數之和 n n1 n2 nk,其中 n1 n2 nk 1 k 1 正整數 n的這類表現稱為正整數 n的分別...
nyoj 90 整數劃分
整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式 n m1 m2 mi 其中mi為正整數,並且1 mi n 則為n的乙個劃分。如果中的最大值不超過m,即max m1,m2,mi m,則稱它屬於n的乙個m劃分。這裡我們...
NYOJ 90整數劃分
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 將正整數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 ...