【递归练习】分数字v3
题目描述
将n分成m个大于0的不同数的和,1 2同 2 1 视作相同的划分。
按照字典序输出所有方案。数据保证存在解,即不会出现1+2+...m > n的情况
输入格式
2个数 n,m(1 <= m <= 10,1 <= n <= 50 )。 1+2+...m <= n
输出格式
按照字典序,输出所有方案。数字之间,用空格划分。
样例数据
input
13 3
output
1 2 10
1 3 9
1 4 8
1 5 7
2 3 8
2 4 7
2 5 6
3 4 6
数据规模与约定
对于100%的数据,1 <= m <= 10,1 <= n <= 50。
时间限制:1s
空间限制:
本题考察递归知识。
代码如下,
#include<stdio.h>
int n,m,sum=0,count=0;
int a[110];
int book[110];
void dfs(int x,int num)
{
if(sum>n)
return ;
if(sum==n&&num==0)
{
for(int i=0;i<count-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[count-1]);
return ;
}
for(int i=x;i<n;i++)
{
if(book[i]==0)
{
a[count++]=i;
book[i]=1;
sum+=i;
dfs(i,num-1);
sum-=i;
book[i]=0;
count--;
}
}
}
int main()
{
scanf("%d %d",&n,&m);
dfs(1,m);
return 0;
}