传送门:数的划分
dfs+剪枝版本:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int ,int>PII;
typedef long long ll;
int cnt,sum;
int n,m;
const int N=210;
void dfs(int sum,int last,int u)
{
if(u==m&&sum==n)
cnt++;
if(u!=m-1) //此处剪枝,缺少会有三个测试点超时
for(int i=last;i<=n-sum;i++)
dfs(sum+i,i,u+1);
else
{
if(n-sum>=last)
dfs(n,n-sum,u+1);
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n/m;i++)
dfs(i,i,1);
cout<<cnt<<endl;
return 0;
}
DP版本:
思路:(在写了)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int ,int>PII;
typedef long long ll;
int ans,sum;
const int N=1010;
int f[N][N];
int n;
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
f[i][1]=1;
for(int i=2;i<=n;i++)
for(int j=2;j<=i;j++)
{
f[i][j]=f[i-1][j-1]+f[i-j][j];
}
cout<<f[n][m]<<endl;
return 0;
}