本题在洛谷上的链接:https://www.luogu.org/problemnew/show/P1025
呃,我果然还是不行,连道水题都A不了。
整理了两种方法,都比较有代表性:搜索和DP。
搜索显然是穷举k位上每位都是什么数,为了避免重复,要控制使数的大小不下降;另外枚举时要加一个可行性剪枝,if(now+(k-d+1)*i>n) break。
1 #include<cstdio> 2 int n,k,ans; 3 void dfs(int d,int now,int last) { 4 if(d==k+1) {if(now==n) ++ans;return;} 5 if(now>=n) return; 6 for(int i=last;i<=n;++i) { 7 if(now+(k-d+1)*i>n) break; 8 dfs(d+1,now+i,i); 9 } 10 } 11 int main() { 12 scanf("%d%d",&n,&k); 13 dfs(1,0,1); 14 printf("%d",ans); 15 return 0; 16 }