Hrbust oj/哈理工 oj 1216数的划分

本文详细解析了数的划分问题,给出了具体的算法实现,并通过示例说明如何将整数n分成k份,确保每份都不为空且任意两份不同。采用递归公式sum(n,m)=sum(n-1,m-1)+sum(n-m,m)进行求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数的划分
Time Limit: 1000 MSMemory Limit: 65535 K
Total Submit: 200(98 users)Total Accepted: 136(95 users)Rating: Special Judge: No
Description
将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5; 1,5,1; 5,1,1;
问有多少种不同的分法。
Input
有多则测试数据。
对于每组测试数据,仅有一行,包括两个整数n,k (6<n<=200,2<=k<=6)。
Output
对于每组测试数据,输出一个整数,即不同的分法。
Sample Input
7 3
Sample Output
4
Hint
输入: 7 3
输出:4 {四种分法为:1,1,5; 1,2,4; 1,3,3; 2,2,3;}
Source
NOIp2001高中组
Recommend
黄李龙

果然菜的抠脚~

题目分析:一开始想用dfs来做,用set和sort去重,失败了~ 难过 后来百度看了别人的才知道原来这样做 ↓ 
这样考虑假设 sum(n,m) 为和为n的m个元素组成的所有可能,按题目要求无论n和m是多少,都会分成两种情况:
1、这个集合中至少含有一个1。2、这个集合中不含有1。

sum(n,m) = sum(n-1,m-1) + sum(n-m,m)  我们可以举个栗子

**这样的话还是很难理解,我们假设有7个小球3个箱子,不允许有空箱子。sum(6,2)表示的是至少有一个箱子中是1个球,既然知道某个箱子肯定有1个球,那我们只需要把6个小球放到剩下的2个箱子中就可以了,sum(4,3)表示的是因为所有箱子中球的数目都大于1,我们先把3个小球放入箱子中即n-m,然后在将剩下的4个球放入3个箱子中即可。**

代码:

#include<iostream>
using namespace std;
int Sum(int n,int m){
	if(n<m)		return 0;		//出现空箱子 
	else if(m==1)	return 1;	
	else if(n==m)	return 1;
	else	return Sum(n-1,m-1)+Sum(n-m,m);
}
int main(){
	int n,m;
	while(cin>>n>>m)
		cout<<Sum(n,m)<<"\n";
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值