整數劃分問題

2022-02-27 15:05:32 字數 1214 閱讀 6102

1 #include2

using

namespace

std;34

//列印一種劃分

5void display(int *result, int

length)

612 cout <1415

//fun: 可以輸出表示式,還可以計算出表示式的個數

16//

n為待劃分整數,m為最大加數上限;

17//

遞迴解法:將divide分為五種情況討論;設 f(n,m) 為 n 的 m 劃分個數

18int divide(int n, int m, int *result, int

length)

19.即劃分為f(n-1,m); 如:6 = 1+1+1+1+1+1時

21if (n >= 0 && m == 1

)22

30return

1; //

相當於一次拆分的表示式31}

3233

//當 n == 1 && m > 1時(待拆分數為1-相當於拆分完畢,且最大加數上限大於1),進行輸出; 如: 4+2+1時

34else

if (n == 1 && m > 1)35

4041

//當 n < m時(拆分數n < 最大加數上限m),由於沒有負數劃分(即將最大上限m換成n)就相當於f(n,n);

42else

if (n 43return

divide(n, n, result, length);

4445

//當 n == m時, 分為: 1.包含n時,只有 ;

46//

2.不包含n時, 劃分中最大數字一定比 n 小,即 n 的所有n-1劃分。綜上:f(n,n) = f(n, m-1) + 1;

47else

if (n ==m)

4853

54//

當 n > m > 1時,分為: 1. 包含m時, }, 的和為n-m,即為f(n-m,m)劃分-呼叫了n55

//2. 不包含m時, 即劃分中的所有值都比 m 小, 即 n 的 m-1 劃分 f(n, m-1);

56//

綜上: f(n,m) = f(n-m, m) + f(n, m-1);

57else61}

6263

int main(void)64

整數劃分問題

整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為 1 我們該如何找出所有的劃分呢?我們可以先來看看整數劃分的規律 譬如正整數 6 劃分情況如下 6 5 14 2 4 1 1 3 3 3 2...

整數劃分問題

給定乙個自然數,分成k部分,a1,a2.的數的和,要求a1 a2.求有多少種?原理 整數n拆分成最多不超過m個數的和的拆分數,和n 拆分成最大不超過m的拆分數相等。根據這個原理,原問題就轉化成了求最大拆分為k的拆分個數與最大拆分為k 1的拆分個數的差 f n,k f n,k 1 f n k,k 如下...

整數劃分問題

首先是遞迴解法 整數劃分問題是將乙個正整數n拆成一組數連加並等於n的形式,且這組數中的最大加數不大於n。如6的整數劃分為 65 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 共11種。下面介紹一種通過遞迴方法得到乙...