原题链接
题目大意
给你一个
n
n
n,把他分成
m
m
m份,求总方案数。
下面这
3
3
3种分法被认为是相同的:
1 1 5
,1 5 1
,5 1 1
S
a
m
p
l
e
\mathbf{Sample}
Sample
I
n
p
u
t
\mathbf{Input}
Input
7 3
S a m p l e \mathbf{Sample} Sample O u t p u t \mathbf{Output} Output
4
H
i
n
t
&
E
x
p
l
a
i
n
\mathbf{Hint\&Explain}
Hint&Explain
可行的分法是1 1 5
,1 2 4
,1 3 3
,2 2 3
。
解题思路
既然把顺序调换一下也只算一种,为何不把分出来的数从小到大排序呢?
直接
d
f
s
dfs
dfs一下每一个分法,注意每一次分的数都要
≥
\ge
≥上一次分出来的数,最后记数即可。
上代码
#include<iostream>
using namespace std;
int n,m,res;
void dfs(int k,int sum,int last)
{
// if(sum>n) return ;
if(k==m+1)
{
if(sum==n) res++;
return;
}
for(register int i=last; i<=(n-sum)/(m-k+1); i++)
dfs(k+1,sum+i,i);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
else dfs(1,0,1);
cout<<res<<endl;
return 0;
}
完美切题 ∼ \sim ∼