1 #include2using
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種。下面介紹一種通過遞迴方法得到乙...