[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

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

#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);
	}
}
posted @ 2018-07-09 10:22  Steve_braveman  阅读(144)  评论(0)    收藏  举报