问题 G: 划分整数
题目描述
将整数n分成k份,且每份不能为空,任意两种分法不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同
的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
输入
输入n,k (6<n≤200,2≤k≤6)
输出
输出一个整数,即不同的分法。
样例输入
7 3
样例输出
4
提示
4种分法为:1,1,5;1,2,4;1,3,3; 2,2,3 说明部分不必输出
水题,但不能暴力,找规律,提示给出的样例很好,明显第一个不超过n/k,再往下推,除了最后一个每个都满足小于等于 剩余数大小surp/还可以取得数cur 并且大于等于前一个数,即num<=surp/cur,num>=pre.
#include <iostream>
#include <cstdio>
using namespace std;
const int N=100;
int sum=0;
void calc(int pre,int cur,int surp){
if(cur==2) {sum+=(surp/2-pre+1);return;}
for(int num=pre;num<=surp/cur;num++)
calc(num,cur-1,surp-num);
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
calc(1,k,n);
printf("%d",sum);
return 0;
}