洛谷题单指南-搜索-P2404 自然数的拆分问题

原题链接:https://www.luogu.com.cn/problem/P2404

题意解读:将整数拆成若干数相加,按字母序输出,可以转换成从小到大往数组填数的问题,直到填的数之和等于n。

解题思路:

通过DFS,每次填一个数,填数时从1~n-1逐个填

注意两个条件不能继续DFS:

1、将填的数之和超过n

2、将填的数小于上一次填的数,因此填数时从上一个数~n-1逐个尝试即可

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n;

int a[10];

void dfs(int k, int sum)
{
    if(sum == n)
    {
        for(int i = 1; i < k; i++)
        {
            if(i > 1) cout << "+";
            cout << a[i];
        } 
        cout << endl;
    }
    for(int i = a[k - 1]; i < n; i++) //每次填的数大于等于上一个数
    {
        if(sum + i > n) break; //如果加起来超过n
        a[k] = i;
        dfs(k + 1, sum + i);
    }
}

int main()
{
    cin >> n;
    a[0] = 1;
    dfs(1, 0);
    return 0;
}

 

posted @ 2024-03-07 17:59  hackerchef  阅读(56)  评论(0)    收藏  举报