欢迎各位赏脸来看本蒟蒻的题解 保姆级教程(不是)

一眼dfs 但是可能会遇到重复加的问题 导致答案错误

其实只要 思考一下dfs递归的本质 就会发现 只需要加一个 特判就可以完美的去重
还有一个小技巧 如果从n开始 加一个数就减一个 就会让我们后面的判定简单很多

话不多说 直接上代码

Code:
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #define int long long //个人习惯 被坑多了就习惯了
  5. using namespace std;
  6. int n;
  7. int a[10010];
  8. void dfs(int x , int now , int st) //x记录每次加的数 , now记录当前还需要加的数 , st记录数组下标 用于递归完后输出答案;
  9. {
  10. if (now == 0)
  11. {
  12. printf("%d=", n); // =的位置需要注意 不要放在for里面了
  13. for (int i = 1 ; i < st - 1 ; i ++ )
  14. {
  15. printf ("%d+" , a[i]);
  16. }
  17. printf("%d\n" , a[st - 1]); //最后一个需要单独挑出来 不然会多出+号
  18. }
  19. for (int i = 1 ; i < n ; i ++ )
  20. {
  21. if (now - i >= 0 && i >= a[st - 1]) //重点 i >= a[st - 1] 特判处理上一个状态的数字 必须满足当前加的数 大于等于上一个数 即可完美去重 不需要使用哈希表去重 节约时间
  22. {
  23. a[st] = i; // 记录答案
  24. dfs(i , now - i , st + 1); // 递归
  25. }
  26. }
  27. }
  28. signed main()
  29. {
  30. cin>> n;
  31. dfs(0 , n , 1); // 从n开始 记录为第一个位置
  32. return 0 ;
  33. }
点赞(0)
 

8 分

4 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

036叶洪鑫 6月前 回复TA
收徒大佬!  >3>