组合数求解

从N个数中选择k个,共有多少组合?简单说就是求解C(N,k)。

实际问题,有N个教授,要选择k个组成委员会,共有多少种组合方式?


递归法:

将这N个人按照编号从小到大排好, 1,2,3...,k,...N

现在考虑从前M个人中选择k个,那么有两种情况:
1. 第M个人选进去,那么就是从剩下的M-1个人中选择k-1个,再加上第M个组成;
2. 第M个人不选进去,那么就是直接从M-1个人中选择k个。

组合数就是这两种情况的加和。
就构成了
C(M,k) = C(M-1,k-1) + C(M-1,k)
计算的之后可以直接从C(N,k)开始,当然要注意初始化,和终止条件。

直接从组合公式也能得到这个公式。

现在看代码:

#include <iostream>
using namespace std;

int Cal(int N , int k)
{	
	if(0 == k || 0 == N)
	{
		return 1;
	}
	
	if(N < k)
	{
		return 0;
	}
	
	if(N == k)
	{
		return 1;
	}
	
	return Cal(N-1,k) + Cal(N-1,k-1);
}

//	test
int main()
{
	int N = 3;
	int k = 2;
	cout<<Cal(N,k)<<endl;
}

问题变形:

如果N个数中有重复呢?例如:N个字符,选出k个字符组合起来,共有多少种组合?再者,共有多少种排列?(组成多少单词)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值