openjudge 簡單的整數劃分問題

2021-07-27 02:26:17 字數 1282 閱讀 9884

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...