我是小白 祝你nb
做了些注释
#include<bits/stdc++.h>
using namespace std;
int n,k;
int ans=0;
void dfs(int x,int y,int z){
if(z==0&&x==0){
ans++;
return;
}else if(z==0&&x!=0){
return;
}
for(int i=y;i<=x;i++){
/*
* 这里的y是已经选择的数,之后再选择的数必须要从这个开始,不能够小于这个数
* x是还剩下的数,这里犯了个错误,可以等于的,就是那种情况,选择了等于之后,同时z也变为0了,然后就成功了,
*/
dfs(x-i,i,z-1);
}
}
int main(){
scanf("%d%d",&n,&k);//n代表总数,
/*(输入4 2作为例子)
* 为什么要设置n呢,为了检查最后选择的是否成立
* 比如已经分好了 dfs最后分的结果是1 1,
* 判断是否合理就是拿4去减掉ta们,结果是2,很显然是不对的
* 如果是分的是1 3,4减掉ta们很显然是可以的,减去之后结果为0
* 但是你是很难在最后分好之后,用4去减的,除非你将每次选择的数给纪录下来,然后最后再拿4减,很麻烦
* 每次选好一个之后就减这样分好最后一个数之后,就已经减完了所有的数了,这样是很优雅的
*/
dfs(n,1,k);
/*(4 2为例子)
*三个参数代表还 选择之后剩下的数,已经选择的数,选择之后还需要分成几个数
* 主函数中的dfs“已经选择的数”为什么是1呢,如果选择是1的话,那么一开始的意思不就是,还剩下4,选择1,还要分2个数。//4 2为例子
* 不过好像这个一开始的是入口,并不能够算真正开始
* 进入之后在内部的dfs才是真正的开始,那时三个参数变为3 1 1就合理了
* 再往下,2 2 0同理。
* 在dfs犯了个错误,还在思考怎样才可以选第一个数,然后又需要增加什么条件选第二个数
* 实际上 直接不用管,遍历就是,分好了看看是否合理,合理就可以纪录,不合理继续遍历。
* 比如这个dfs遍历一开始就是将4分成了两个1和1,最后检验不合理,然后继续。,
*/
cout<<ans<<endl;
return 0;
}

京公网安备 11010502036488号