题目概况
题目概况: https://www.luogu.com.cn/problem/P2404
难度: 普及-
题目分析
简化题目: 题目很简单了
涉及知识点: 深度优先搜索DFS
解题思路:
通过从上一个选择了的元素开始枚举、选择,如果总和与m相等了,就输出当前方案数
状态这样表示: DFS(当前总和,已枚举的数量,上一个被选择的元素)
代码拆解及要点分析
不必,直接上完整代码,看注释就行。
完整代码
#include <iostream>
#include <cstdio>
using namespace std;
int m;
int ans[10];
void dfs(int res, int cnt, int last) { //我现在多大,我是第几个,我前面是多少~
if (res == m) { //达到要求,输出方案数
//首先明确一下输出范围是1~cnt-1,毕竟你这最后一个cnt没东西
for (int i = 1; i < cnt - 1; i++) {
cout << ans[i] << '+'; //直到cnt-2,都直接输出数字加符号
}
cout << ans[cnt - 1] << endl; //最后一个单独输出
return;
}
if (res > m) { //当当前总和大于m
return;
} //必须得加的剪枝,要不然搜索出来的方案数大到离谱
for (int i = last; i < m; i++) { //从上一个被选择的元素开始,直到m-1
ans[cnt] = i;
dfs(res + i, cnt + 1, i); //总和加上i,个数往前推,last就是最后被选择的你
//ans[cnt] = 0; //可以不加,为了整齐划一
}
}
int main() {
cin >> m;
dfs(0,1,1);
return 0;
}
这是一篇关于洛谷P2404题目的解题博客。题目要求使用深度优先搜索(DFS)解决自然数拆分问题,难度为普及级别。博主分析了简化后的题目,并详细解释了解题思路,即从上一个选择的元素开始枚举,直到总和等于目标值。文章提供了完整的代码,并通过注释进行了说明。
131

被折叠的 条评论
为什么被折叠?



