#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int ans = 0;
int n,k;
void dfs(int i,int t,int j){// t 层数,j 和 i 当前数
if (k == t) {
if (j==n) ans++;
return ;
}
for(int p = i ;p*(k-t)+j<=n ; p++)
dfs(p,t+1,j+p);
}
int main(){
cin>>n>>k;
dfs(1,0,0);
cout<<ans;
return 0;
}
挺简单的dfs,为了保证不重复,只需要确保取数的是递增或递减的顺序(不需要严格递增,前后可以相等),
这次存在的问题是:第一,开始dfs是dfs(1,1,1)直接默认了一定会去到1,但其实有很多不取的时候,如果要1,1,1的话可能要在dfs里改一下程序,但还是1,0,0好一些,印象里大部分dfs都是从1,0,0开始,
第二 搜索边界时没有用if的嵌套直接,if(kt && jn)导致,如果k=t了但是j<>n,会一直搜索下去,导致tle,一直没有注意过.以后要注意在循环边界时不管怎样先全部return,再在前面补上其他操作,不要在if里用&&./