洛谷题单指南-搜索-P2404 自然数的拆分问题
原题链接:https://www.luogu.com.cn/problem/P2404
题意解读:将整数拆成若干数相加,按字母序输出,可以转换成从小到大往数组填数的问题,直到填的数之和等于n。
解题思路:
通过DFS,每次填一个数,填数时从1~n-1逐个填
注意两个条件不能继续DFS:
1、将填的数之和超过n
2、将填的数小于上一次填的数
100分代码:
#include <bits/stdc++.h>
using namespace std;
int n;
int a[10];
void dfs(int k, int sum)
{
if(sum == n) //如果已填的数和为n
{
for(int i = 1; i < k; i++)
{
if(i > 1) cout << "+";
cout << a[i];
}
cout << endl;
}
for(int i = 1; i < n; i++)
{
if(sum + i > n) break; //如果加起来超过n
if(i < a[k - 1]) continue; //如果填的数比前面的小,不符合顺序
a[k] = i; //第k个数填i
dfs(k + 1, sum + i);
}
}
int main()
{
cin >> n;
dfs(1, 0);
return 0;
}