整数划分

整数划分

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
 
描述
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 
其中n1≥n2≥…≥nk≥1,k≥1。 
正整数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。 

 
输入
第一行是测试数据的数目M(1<=M<=10)。以下每行均包含一个整数n(1<=n<=10)。
输出
输出每组测试数据有多少种分法。
样例输入
1
6

方法一:

#include<stdio.h>
int main()
{
 int t,n,count;

 int divide(int m, int max);

 scanf("%d",&t);
 while(t--)
 {
  scanf("%d",&n);

  count=divide(n,n);
  printf("%d\n",count);
 }
 return 0;
}

int divide(int m, int max)
{
 int count,i;

 count=0;
 if(max<=1)
 {
  return 1;
 }
 else
 {
  for(i=1; i<=max; i++)
   count+=divide(m-i, (i<m-i)? i:(m-i));

  return count;
 }
}


 方法二:


#include<iostream>
using namespace std;
int q(int n,int m)
{
 if((n<1)||(m<1) )return 0;
 if(n==1||m==1) return 1;
 if(n<m) return q(n,n);
 if(n==m)return q(n,m-1)+1;
 return q(n,m-1)+q(n-m,m);
}
int main()
{
 int a;
 cin>>a;
 while(a--)
 {
  int n;
  cin>>n;
  cout<<q(n,n)<<endl;

 }
}
       

原文地址:https://www.cnblogs.com/hpuwangjunling/p/2432020.html