将n分成若干个大于0的数的和,按照字典序输出所有方案。
一个数 n(1 <= n <= 15 )。
4
1 1 1 1
1 1 2
1 2 1
1 3
2 1 1
2 2
3 1
4
题目说要按字典序我们依次递归就行,当搜到就折返,重新赋值。
#include<iostream>
#define endl "\n"
using namespace std;
int a[20];
int x,sum;
void dfs(int step) //代表走到了第几个位置
{
for(int i=1;i<x;i++) //遍历 1,2 ,3,4
{
if(sum+i>x) return ; //如果sum+i大于给定值的话,那么说明此时再往下走毫无意义
else sum+=i;
if(sum<=x) //存入结果到a数组
a[step]=i;
if(sum==x)
{
for(int i=1;i<=step;i++) cout<<a[i]<<' ';
cout<<endl;
sum-=a[step]; //因为这个i是在此步加的不是在上一个递归循环加的,所以走到尽头时要减去
return;
}
dfs(step+1); //回溯
sum-=i; //恢复现场
}
}
int main()
{
cin>>x;
dfs(1);
cout<<x;
return 0;
}