整数划分
一、只输出划分个数
#include<stdio.h>
#include<algorithm>
using namespace std;
//整数n划分成不大于m的划分个数
int divide(int n,int m)
{
if(n==1 || m==1) return 1;
if(n<1 || m<1) return 0;
if(n < m) return divide(n,n); //m不能大于n
if(m == n) return (divide(n,m-1) + 1); //自身为一种情况
if(n > m) return (divide(n,m-1) + divide(n-m,m)); //分为至少包含一个 m 的划分和 <=m-1 的划分
//必包含m的情况是把n-m之后得到剩余的数的<=m的划分情况 ,因为已经确定至少有一个m了
}
int main()
{
int n;
while(~scanf("%d",&n))
{
printf("%d\n",divide(n,n));
}
return 0;
}
二、输出划分个数及划分具体情况
#include<cstdio>
#include<algorithm>
using namespace std;
void print(int a[],int n)
{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
//整数n划分成不大于m的划分个数
int divide(int n,int m,int len,int a[])
{
if(m==1){
if(n==0){
print(a,len);
}else if(n>0){
a[len] = 1;
divide(n-1,m,len+1,a);
return 1;
}
}
else if(n==1){
if(m>1){
a[len] = 1;
print(a,len+1);
return 1;
}
}
else if(n < m) return divide(n,n,len,a); //m不能大于n
else if(m == n) {
a[len] = m;
print(a,len+1);
return divide(n,m-1,len,a) + 1; //自身为一种情况
}
else if(n > m) {
a[len] = m;
return divide(n-m,m,len+1,a) + divide(n,m-1,len,a) ;//!!这里必须先递归减去m的情况
}
}
int main()
{
int n;
int a[100]={0};
while(~scanf("%d",&n))
{
printf("\n%d的划分个数为:%d\n---------\n",n,divide(n,n,0,a));
}
return 0;
}