原题链接
题目大意
给你一个
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 ∼
这篇博客探讨了一个数学问题:将一个整数n分成m份的不同方案数。问题的关键在于,顺序不同的分法被视为相同。作者提出通过排序分出来的数并使用深度优先搜索(DFS)策略来解决。在给定的例子中,当n=7,m=3时,存在4种有效的分法。解题思路包括从最小数开始递增地进行DFS,并在每次递归时确保当前数大于或等于前一次分出的数。最后,博客给出了C++实现的代码片段。

被折叠的 条评论
为什么被折叠?



