P2404 自然数的拆分问题
#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;
}
恢复现场做法
path[k] = i;
k ++;
sum += i;
dfs(sum, i, k); //这里直接把+1后的数值传入函数,避免了恢复现场
//这里因为选的数可以重复所以start传入i即可
//不降原则
sum -= i;
k --;
// path[k] = 0; //不需用恢复因为会被替换