問題整数再帰分割分析
正の整数nは、正の整数であり、一連のように表されます
N = N1 + N2 + N3 + N4 + ... + NK(ここで、N1> = N2> N3 => = N4 ........> = NK> 0、K> = 1)
これは、正の整数となるnのnが正の整数除算を表します。
異なる正の整数の数を割るN P(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以下、この数をmとなる数の加数の分割以上にすることができます。
例えば、図6は、実際より少ない加数6 6のように、6未満6等しい分割加数に分割されて分割されると考えることができます
我々は比較的容易に解決するために、このような観点から、その思考を見つけるためなぜ、この男、それを紹介します。
我々は、Qと呼ばれるタイプの数を分割する(n、m)は
再帰的であるようにパラメータの決意
n = 1つのQ(1、M)(1)分割され表す1、唯一1つの分割方法1
(2)M = 1、Qは(N、1):M = 1は、実際には1より全て加算し、置かれたとき、すべての加数はわずか1(考慮しない陰性)であり、もちろん、一つだけ通行区分の種類
(3)場合のn == M Q(N、N):このときの分割数のうちのn限定されるものではなく、デフォルトの制限がnより大きくない、この時点でクラス分割の総数は、2つのケースを比較することでした良い解決策:
(N == Mため、またはM)Nを含む数に1スプリットアップ:それはわずか6 6分割の例の唯一の方法である。一つの方法
2(M == Nため、またはM)、Nに分割アップの数は含まれない:6は6未満の数に分割されると考えることができる未満又は5に等しい実際には、実際には、(次のqを見つけますN、N-1)またはq(N、M-1)、この場合、N> M-1、回帰式がQ(N、Mに解決されるに)N> M
一緒にQ(N、N)= 1 + Q(N、M-1)
N> M(4):出会いは、実際には、N分割状態で見ることができるこのような問題は、すべてのより小さい数mに分割され、上記において、6分割の11種類があり、数は少ない数のような5よりなるアウトするために分割したときにそれは、数を制限するために6のために刻まれていなかった、それはのない11種類です。
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。
このとき2つのケース:M Mあっとありません:
Mは含まれていません。
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。
これらの場合、実際には、回帰式に、以下ケース4から6の分割数を計算するか、Qである(N、M-1)
Mが含まれています:
5 + 1。
今回は、mは主人公がもはやある分割数は、我々は唯一のラインの分割nmのうち、(キー)を尋ねると判断されます
NM応じてMのこの時点で分割、以来。
例えば含む5メートル= 6-5 = 1の分割は、例えば、限定するものではないが、4の分割分割含むこと= 2,2 6-4要求されます。
漸化式Q(NM、m)の内側に配置されます
(5)Q(n、m)はN <M、例えば、n = 6、M = 7は、実際には、6を解決以下、7以下を与えるために6の数を割ることによって得られます
この場合には、Qが(N、N)を解くためのケースです。
上記の分析に基づいて:
Q(N、M)= 1、場合N == 1。
Q(N、M)= 1、M == 1。
Q(N、M)= Q(N、n)は、当N <M。
Q(N、M)= Q(N、M-1)+1、N == M。
Q(N、M)= Q(N - M、M)+ Q(N、M -1)、当N> M。
#include<iostream>
#include<ctime>
using namespace std;
int q( int n , int m ){
if( n==1 || m==1 ){
return 1;
}else if( n > m ){
return q( n-m , m )+q( n , m-1 ); //关键所在
}else if( n < m ){
return q( n , n );
}else{
return 1+q( n,n-1 );
}
}
int main(){
double start,stop,dur;
start=clock();
int a=6;
cout<<q(6,6);
stop=clock();
dur=stop-start;
cout<<"\n用时:"<<dur<<"毫秒\n";
return 0;
}