ny 90 整數劃分 劃分

2021-08-29 02:59:01 字數 1505 閱讀 7167

時間限制: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 ...