-DFS- [洛谷 P1025][NOIp 2001]数的划分

题目描述

将整数 $n$ 分成$k$份,且每份不能为空,任意两个方案不相同(不考虑顺序)。

例如: $n=7$ , $k=3$ ,下面三种分法被认为是相同的。

$1,1,5$;
$1,5,1$;
$5,1,1$;

问有多少种不同的分法。

输入格式

$n$,$k$ $(6<n≤200,2≤k≤6)$

输出格式

$1$ 个整数,即不同的分法。

输入样例

7 3

输出样例

4

Solution

这道题十分简单,就是裸的DFS,代码也只有十多行,不过需要一个小小的剪枝。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<bits/stdc++.h>
using namespace std;
int a[10001]={1},n,tot,k;
void dfs(int,int,int);
int main(){
cin>>n>>k;
dfs(1,0,0);
cout<<tot;
}
void dfs(int s,int t,int p){//一共三个参数,分别是:当前拆分出来的数、数的总和、分的第几份
if(p==k){
if(t==n) tot++;
return;
}
for(int i=s;t+i*(k-p)<=n;i++){//剪枝
dfs(i,t+i,p+1);
}
}
文章作者: RiverFun
文章链接: https://stevebraveman.github.io/blog/2018/08/21/10/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 RiverFun

评论