题解
2025-11-02 20:57:45
发布于:广东
3阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
void dfs(int now,int d,int sum){ //上一次的选的数字、当前递归层数、当前总和
if(d==k&&n-sum>=now){ //如果当前递归次数为 k-1 次且剩下的大小(当前要选的数)>= now (防止重复),ans++ 并 return
ans++;
return;
}
for(int i=now;n-sum>=i;i++){
//为了保证不重复,i 至少等于上一次选的数字
//n - sum是可选大小,由于下个递归中 i 至少等于当前的 i ,所以在这里提前拦截过大的 i
dfs(i,d****um+i); //递归层数+1,总和+1
}
}
int main(){
cin>>n>>k;
dfs(1,1,0); //初始为1,层数为1,总和为0
cout<<ans;
return 0;
}
dfs函数定义:求出当前位置可能数字的选取方法和下面所有位置的可能数字的选取方法。- 重要的去重方式:
i >= now
这里空空如也

有帮助,赞一个