將正整數n表示成一系列正整數之和:n=n1+n2+…+nk,
其中n1≥n2≥…≥nk≥1,k≥1。
正整數n的這種表示稱為正整數n的劃分。
輸入:乙個正整數n
輸出:n不同劃分個數以及n的劃分結果。
例如正整數6有如下11種不同的劃分:
6;5+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
採用分治思想n本身作為一種劃分即為一種,加上剩下種類的個數
即將分割為兩層,並不斷的遞迴
這裡我們就可以得到乙個函式q(n,m)表示對n進行劃分,出現的最大的整數大小不超過m
得到計算劃分個數的**
#include
using namespace std;
//q(n,m)對數n進行劃分,最大的數不超過m
intq
(int n,
int m)
if(m>n)
return
q(n,n);if
(n==m)
return
q(n-m,m)+q
(n,m-1)
;}intmain()
借用棧的思想,將劃分的結果存入棧中
得到計算劃分結果的**
#include
using namespace std;
//q(n,m)對數n進行劃分,最大的數不超過m
const
int n=
100;
int _stack[n]
;int top=0;
intq
(int n,
int m)
else
if(n>
1&& m==1)
}if(top!=0)
cout<
while
(_stack[top-1]
==1) top--;}
return1;
}if(m>n)
return
q(n,n);if
(n==m)
cout<
while
(_stack[top-1]
==1) top--;}
return1+
q(n,m-1)
;}_stack[top++
]=m;
return
q(n-m,m)+q
(n,m-1)
;}intmain()
整數劃分演算法原理與實現
整數劃分問題是將乙個正整數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種。下面介紹一種通過遞迴方法得到乙個正整數的劃分數...
整數劃分演算法原理與實現
整數劃分問題是將乙個正整數n拆成一組數連加並等於n的形式,且這組數中的最大加數不大於n。如6的整數劃分為 6 5 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種。下面介紹一種通過遞迴方法得到乙個正整數的劃分...
整數劃分演算法原理與實現
整數劃分問題是將乙個正整數n拆成一組數連加並等於n的形式,且這組數中的最大加數不大於n。如6的整數劃分為 6 5 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種。下面介紹一種通過遞迴方法得到乙個正整數的劃分...