今天通过练习P2404 自然数的拆分问题这一题,对dfs有了更进一步的了解。
对于P2404 自然数的拆分这题,倘如是只用循环去解决,难度是相当大的。但是我们通过dfs和循环的结合,却能将这么复杂的问题简单地解决。我是参考了csdn上某位博主的代码以及解题思路来解决这道题的。
#include<iostream>
using namespace std;
int n, t = 0, a[10000];
void dfs(int las, int sum)//考虑las,还剩下sum需要划分
{
//当没有余下的(没有需要划分时),输出答案
if (sum == 0)
{
cout << a[0];
for (int i = 1; i < t; i++) cout << "+" << a[i];
cout << endl;
return;
}
//如果要考虑的这个数比剩下要划分的大,没办法选,return
//如果考虑的这个数等于输入的数,不成立,因为拆分至少有两个数,return
if (las> sum || las == n) return;
a[t++] = las;//把考虑的数加入答案数组
dfs(las, sum - las);
t--;//回溯
dfs(las + 1, sum);
}
int main()
{
cin >> n;
dfs(1, n);
return 0;
}