9 简单组合问题

对于有 m个元素的集合,在元素能重复取的情况下,我们可以得到有 r 组合的集合;例如,当 m=2, r=4 时,集合 {a,b} 可以划分为 5
个不同的 r 组合的集合 :
{a,a,a,a};
{a,a,a,b};
{a,a,b,b};
{a,b,b,b};
{b,b,b,b};
输入
输入数据有多组,每行输入 2 个整型数据 m,r , (0<m,r<=20)
输出
输出可以划分的集合个数
样例输入
2 4
样例输出
5

思路

代码

#include <stdio.h>
long long whale[21][21];
/*
    题目中只要求组合,各个符号出现的先后顺序不做考虑,是无关的。
	result(3,5)=
		a出现0次时, + result(2,5)
		a出现1次时, + result(2,4)
		a出现2次时, + result(2,3)
		a出现3次时, + result(2,2)
		a出现4次时, + result(2,1) 
		a出现5次时   + 1
        所以:result(3,5)=result(2,5)+result(2,4)+result(2,3)+result(2,2)+result(2,1)+1

		  2,r
		  0, 1,r
		  1, 1,r-1
		  2, 1,r-2
		  ...
		     1,1
*/
int main() {
	for(int cursor=1; cursor<=20; cursor++) whale[1][cursor]=1;
	for(int m=2; m<=20; m++) {//可选择的字母的种类增多
		for(int r=1; r<=20; r++) { //位置逐渐增多
			for(int rb=1; rb<=r; rb++) {
				whale[m][r] += whale[m-1][rb];
			}
			whale[m][r]+=1;
		}
	}
	for(int i=1;i<=20;i++){
		for(int j=1;j<=20;j++){
			printf("%lld\n",whale[i][j]);
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jiuweideqixu/article/details/87971057