问题:用户选择了5场赛事,每场比赛的赛果有多个(主胜、平、主负等等),若该用户5场比赛的投注结果为[2、1、3、4、2个赛果],过关方式有2串1、3串1、4串1和5串1。那么投注的注数是都少类?
对于2串1:可选的组合 2-1=>2注
2-3=>3注
2-4=>8注
2-2=>4注
1-3=>3注
1-4=>4注
1-2=>2注
3-4=>12注
3-2=>6注
4-2=>8注,总共2+3+8+4+3+4+2+12+6+8=52注。
其他的过关方式用同样的方法可以求得。这是应该是典型的排列组合问题?如果用编程来实现关键在于找到每种过关方式的所有组合。
为题本质:求(1...m)中,n个数的组合
解决思路(借鉴出处http://bbs.csdn.net/topics/380048966):是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。
首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,
同时将其左边的所有“1”全部移动到数组的最左端。
当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。
例如求5中选3的组合:
1 1 1 0 0 //1,2,3
1 1 0 1 0 //1,2,4
1 0 1 1 0 //1,3,4
0 1 1 1 0 //2,3,4
1 1 0 0 1 //1,2,5
1 0 1 0 1 //1,3,5
0 1 1 0 1 //2,3,5
1 0 0 1 1 //1,4,5
0 1 0 1 1 //2,4,5
0 0 1 1 1 //3,4,5
鉴于网上已经有很多其他语言的算法实现,这里仅给出OC的实现
// count : 选了多少场比赛
// passway : 某一过关方式
// array : 每场选的赛果的数目