dfs秒了
2026-01-07 21:15:15
发布于:浙江
6阅读
0回复
0点赞
大家好,我是энтджей,今天是我2026年第一次正式发题解!
能不能点个赞
喜讯:我的CCF-GESP6级 - 62.5 过了!
回归正题:
首先:
- 我看到这道题就是想到用dfs写
紧接着:
- 我们要找到dfs的入参:
- 确定下来,入参需要: 上一个的数字(last number)、目前的数字总和(sum)、当前已经选了多少个数字(current )
- 即:
void dfs(int last,int sum,int cur)
- 我们要确定dfs的终止条件:
- 也就是 使用的数字个数达到了k
- 这时候有两个分支
- 即:
if(cur == k){ if(sum == n) cnt++; return ; }
- 我们要递归一下了:
- 很简单,就是一个一个试数字:
- 即:;
for(int i = last;i <= n && sum + i <= n;i++){ //剪枝,超过当前和(sum + i)的话就不用递归了
dfs(i,sum + i,cur + 1);
}
- 好那么差不多结束了,在正常输入一下和调用函数,打一下头文件和using,即:
#include<bits/stdc++.h>
using namespace std;
int main(){
cin >> n >> k;
dfs(1,0,0);
cout << cnt;
return 0;
}
那么好了!“合成”:
就是完整代码啦
#include<bits/stdc++.h>
using namespace std;
int n,k,cnt;
void dfs(int last,int sum,int cur){
if(cur == k){
if(sum == n) cnt++;
return ;
}
for(int i = last;i <= n && sum + i <= n;i++){
dfs(i,sum + i,cur + 1);
}
}
int main(){
cin >> n >> k;
dfs(1,0,0);
cout << cnt;
return 0;
}
🎉完结撒花🎉
这里空空如也




有帮助,赞一个