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;     //不需用恢复因为会被替换
posted @ 2022-12-21 15:34  Pamper/  阅读(18)  评论(0)    收藏  举报