100ms
記憶體限制:
65536kb 描述
將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。
輸入標準的輸入包含若干組測試資料。每組測試資料是乙個整數n(0 < n <= 50)。
輸出對於每組測試資料,輸出n的劃分數。
樣例輸入
5
樣例輸出
7
提示5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
題目分析:
遞迴法:
根據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
(5)但n>m時,根據劃分中是否包含最大值m,可以分為兩種情況:
(a)劃分中包含m的情況,即}, 其中 的和為n-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);
綜上所述:
f(n, m)= 1; (n=1 or m=1)
f(n,m) = f(n, n); (n
1+ f(n, m-1); (n=m)
f(n-m,m)+f(n,m-1); (n>m)
**實現:
#include #include using namespace std;
int func(int n,int m)
{ if(n==1||m==1)
return 1;
if(n==m)
return func(n,m-1)+1;
if(n>m)
return func(n-m,m)+func(n,m-1);
if(n
遞迴 OpenJudge 7215 簡單整數劃分
簡單的整數劃分問題 總時間限制 100ms 記憶體限制 65536kb 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。輸入標準的輸入包含若干組測試資料。每組...
OpenJudge 006 簡單的整數劃分問題
總時間限制 100ms 記憶體限制 65536kb 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。輸入 標準的輸入包含若干組測試資料。每組測試資料是乙個整數...
整數的分劃問題
對於乙個正整數n的分劃,就是把n表示成正整數之和的表示式。主要,分劃與順序無關,例如6 5 1和6 1 5被認為是同一種分劃。解題思路 定義乙個函式q n,m 表示正數n的 任何加數都不超過m 的分劃的數目,n的所有分劃數目p n 就應該表示為q n,n 一般的q n,m 有如下遞迴關係 1 q n...