#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10;
int n;
int path[N];
void dfs(int sum, int start, int k)
{
if(sum == n)
{
printf("%d", path[0]);
for(int i = 1; i < k; i ++)
printf("+%d", path[i]);
puts("");
}
for(int i = start; i <= n - sum; i ++)
// if((sum + i) <= n)
{
if(i == n) break;
path[k] = i;
// k ++;
// sum += i;
dfs(sum + i, i, k + 1); //这里直接把+1后的数值传入函数,避免了恢复现场
//这里因为选的数可以重复所以start传入i即可
//不降原则
// sum -= i;
// k --;
// path[k] = 0; //不需用恢复因为会被替换
}
}
int main ()
{
cin >> n;
dfs(0, 1, 0);
return 0;
}
标签:P2404,int,自然数,dfs,start,拆分,printf,path
From: https://www.cnblogs.com/fxc2002/p/16996384.html