# P1025 [NOIP 2001 提高组] 数的划分
## 题目描述
将整数 $n$ 分成 $k$ 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:$n=7$,$k=3$,下面三种分法被认为是相同的。
$1,1,5$;
$1,5,1$;
$5,1,1$.问有多少种不同的分法。
## 输入格式
$n,k$ ($6<n \le 200$,$2 \le k \le 6$)
## 输出格式
$1$ 个整数,即不同的分法。
## 输入输出样例 #1
### 输入 #1
```
7 3
```### 输出 #1
```
4
```## 说明/提示
四种分法为:
$1,1,5$;
$1,2,4$;
$1,3,3$;
$2,2,3$.**【题目来源】**
NOIP 2001 提高组第二题
#include<bits/stdc++.h>
using namespace std;
const int N=10;
int n,k;
int res=0;
int arr[N];
/*
x:当前枚举到第几个位置
start:当前枚举到第几个数
sum:当前枚举数的总和
*/
void dfs(int x,int start,int sum)
{
if(x>k)
{
if(sum==n)
{
res++;
}
return;
}
for(int i=start;sum+(k-x+1)*i<=n;i++) //结束条件 后面的数不够了
{
arr[x]=i;
dfs(x+1,i,sum+i); //dfs下一个位置 从i开始 sum+i
arr[x]=0; //恢复现场
}
}
int main()
{
cin>>n>>k;
dfs(1,1,0);
cout<<res<<endl;
return 0;
}
总结思考:
提前减枝操作, sum+(k-x+1)*i<=n的时候