对于有 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;
}