题解:本题主要考查深搜,剪枝。如果暴力搜一定TLE所以要剪枝,关键就在于所取的数在剩下的分割中小于N{s+i*(k-num)}<=n。
代码如下:
#include<iostream>
using namespace std;
int n,k,sum=0;
void dfs(int ans,int s,int num)
{
if(num==k)
{
if(s==n){sum++;}return ;
}
for(int i=ans;s+i*(k-num)<=n;i++)//剪枝
dfs(i,s+i,num+1);
}
int main()
{
cin>>n>>k;
dfs(1,0,0);
cout<<sum;
return 0;
}
好像有DP的做法,下回再想想。
dfs大法好