问题:
在游戏Dota2中,有一位非常强大的英雄:卡尔,他有三种属性:冰 火 雷. 同时卡尔身上有三个无顺序的属性槽, 他可以从三种属性中任意选择3个放入属性槽中,然后通过当前的属性组合召唤技能. 每种不同的属性组合 都可以为卡尔召唤出不同的技能,共有10种组合:
1 冰冰冰
2 冰冰火
3 冰冰雷
4 冰火火
5 冰火雷
6 冰雷雷
7 火火火
8 火火雷
9 火雷雷
10 雷雷雷
现在我们想继续加强卡尔,如果给卡尔四种属性: 冰 火 雷 风,同时给卡尔四个无顺序的属性槽,从而让卡尔可以从四种属性中任意选择四个,则请问卡尔共 可以召唤出多少种不同的技能?
想法:
1 列举法
四属性均相同的数目: 4
仅有三属性相同的数目: 4*3=12
二属性相同的数目: 4*3*2 - 4*3/2 = 24-6=18
一属性相同的数目: 1
总数为35
写了个代码验证下:
2 其实是个定理: n个元素的集合中,允许重复的r组合有 C(n+r-1,r) 个
允许重复时,n 元素集合的r组合 可以用 n-1 个竖线 和 r颗星 来表示. 这 n-1 条竖线用来标识n个不同的单元. 每当集合的第i个元素出现在组合中,第i个单元就包含1颗星.
例如4元素的5组合 就可以用 3条竖线,5颗星来表示: *|*|**|*
代表含: 第一元素1个,第二元素1个,第三元素2个,第四元素1个.
则: 包含n-1条竖线和r颗星的每一种表示 对应了 n个元素允许重复的r组合,个数为: C(n+r-1,r) (n+r-1个位置选出r个位置放r个星)
则卡尔的三属性技能数(n=3,r=3)为: C(3+3-1,3)=C(5,3)=10
卡尔的四属性技能数(n=4,r=4)为:C(7,4)=35.