数的划分

Description

 

将整数n分成k份,且每份不能为空,任意两种分法不能相同,问有多少种不同的分法。例如:n=7,k=3,可以分成:

1 1 5

1 2 4

1 3 3

2 2 3

4种。

注意1 1 5,1 5 1,5 1 1 是相同的分法。

Input

 

输入有若干组,每组一行,有2个整数n,k.

Ouput

 

对应输出能分成的种数。

Sample Input

 

7 3

7 7

7 2

Sample Output

 

4

1

3


思路:

递推公式:f(n-1,k-1) + f(n-k,k)

假设n个物体分为m堆,有两种可能:

1、有一堆只有一个物体;

2、任何一堆都有至少两个物体

如果是第一种情景;有一堆只有一个物体就把这堆去掉,剩下的就是n - 1物体,放在m - 1堆里。于是就是递推公式第一项f(n-1,m-1);

如果是第二种情景;每一堆都至少有两个物体,那么就把每一堆去掉一个物体,剩下的就是n - m个物体,放在m 堆里。于是就是递推公式第二项f(n-m,m);

#include<iostream>
#include<string>
using namespace std;
int main(){
	int n,k;
	int fun(int n,int k);
	while(cin>>n>>k){
		cout<<fun(n,k)<<endl;
	}
	return 0;
}
int fun(int n,int k){
	if(k == 1){
		return 1;
	}else if(k == n){
		return 1;
	}else if(n < k){
		return 0;
	}else{
		return fun(n-1,k-1) + fun(n-k,k);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值