递归函数从n个人中选k个人与动态规划(Dynamic Programming)

发现一道递归函数的题目,从n个人里面选择k个人组成group,其中的分析方法很像算法课上学习到的动态规划法:

当从n个人里面选择k个人的时候,我们可以假设第n个人被选中了,那么从n个人里面选择k个人的group总共有:在剩下的n-1个人里面选择k-1个人; 我们还可以假设第n个人没有被选中,那么则需要:在n-1个人里面选择k-1个人。 所以可以写成公式:

C(n, k)= C(n-1, k-1) + C(n-1, k)

这个时候我们可以分析一个base case:当k=n 或者 k = 0的时候,我们可以选择的方法就只有1 种。

由此,可以写出这个题目的递归公式:

#include <iostream>
#include <string>
using namespace std;

int C(int n, int k)
{
	int result;
	if(k>n)
	{
		result = 0;
	}
	if (k==0 || n == k)
	{
		result = 1;
	}
	else
	{
		result = C(n-1, k-1) + C(n-1, k);
	}
	return result;
}


int main()
{
	int n;
	int k;
	cout <<"Please insert n and k: "<<endl;
	cin>> n ;
	cin>>k ;
	cout<<"The groups of choosing "<< k <<" people from " << n << " is "<< C(n,k)<<endl;
}
是在练习题目的时候,突然想到,其实这就是动态规划的一种思考方式。

猜你喜欢

转载自blog.csdn.net/weixin_42380877/article/details/80694993
今日推荐