簡單整數劃分問題

2021-08-07 16:03:51 字數 1547 閱讀 1305

1.純遞迴

設函式func(int n, int m) 定義為計算 把整數 n 劃分為 小於或等於 m 的一系列數字之和 的劃分方法有多少種,則對於:

(1)當 n == 1 時,無論 m 取何值,都只能 劃分為 1;

(2)當 m == 1 時 ,無論 n 為何值, 也只能劃分為 n 個 1 相加 ,只有一種劃分方法;

(3)當 n < m, 顯然 func(n, m) = func(n , n);

(4)當 n > m 時, 可分兩種情況討論,

(1)劃分中包含 m 時, 有func(n -m, m) 種劃分方法;

(2)劃分中不包含 m 時, 有 func(n, m-1)種劃分方法;

所以  func(n ,m) = func(n -m, m) + func(n, m-1);

(5)當 n == m 時,當劃分包含 m 時, m = m ,只有一種劃分方法;

當 不包含 m 時, 有 func(n, m-1) 種劃分方法。

根據以上分析:

func( n, n ) = 1, 當 n ==1;

func( n, n ) = 1,當m == 1;

func( n, n )  = func( n,n ) , 當

n < m;

func( n, n )  = func( n, m-1) +1 ,  當n == m;

func( n, n ) = func ( n - m, m ) + func ( n , m -1) ,  當n > m;

相應的**如下:

/** 1.cpp

* * created on: 2023年9月01日

* author: administrator

*/#include using namespace std;

int func(int n, int m)

else if(n < m)

else if (n == m)

else if(n >= m)

}int main()

else if(n < m)

else

} else if (n == m)

else

} else if(n > m)

}int main(){

int n;

memset(dp,-1,sizeof(dp));

while(cin>>n){

cout<

/** 1.cpp

* * created on: 2023年9月01日

* author: administrator

*/#include#includeusing namespace std;

#define n 55

int f[n][n];

int main(){

int n;

while(cin>>n){

n++;

for(int j=1;j<=n;j++){

f[1][j]=1;

for(int i=2;i<=n;i++){

if(i

簡單的整數劃分問題

總時間限制 100ms 記憶體限制 65536kb 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。輸入標準的輸入包含若干組測試資料。每組測試資料是乙個整數n...

openjudge 簡單的整數劃分問題

100ms 記憶體限制 65536kb 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。輸入標準的輸入包含若干組測試資料。每組測試資料是乙個整數n 0 n 5...

4117 簡單的整數劃分問題

總時間限制 100ms 記憶體限制 65536kb 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。輸入 標準的輸入包含若干組測試資料。每組測試資料是乙個整數...