本题在洛谷上的链接: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 }
AC代码(搜索)

相关文章: