这是一个相当复杂但非常有趣的数学学科(称为“覆盖问题”),
我希望您能帮助您实施它。
想象一下一个彩票游戏,其中每张彩票必须从50个数字(从1到50)中选择5个随机数字。
很容易知道中奖的概率,或者拥有1、2、3或4个好数字的概率。
“生成”具有1、2、3、4个良好数字的所有票证也很容易。
我的问题(和代码挑战)与此有关,但略有不同:
我想买一些彩票(尽可能少的),例如我的至少一张彩票有3个好数字。
挑战
您的目标是以任何语言实现这样的通用解决方案(作为程序或只是函数):
// Input: 3 prameters
min_lottery_tickets(total_numbers_to_choose_from, how_many_numbers_to_choose, how_many_good_numbers_i_want)
对于上面的示例,只需调用:
min_lottery_tickets(50, 5, 3)
该程序将生成最小的票证集合以实现此目标。
例:
min_lottery_tickets(10, 5, 2)
将输出7张票,例如:
1 2 3 4 5
5 6 7 8 9
10 1 2 6 7
10 3 4 8 9
3 4 6 7 8
1 2 3 8 9
1 4 9 5 10
因为这样的票足以覆盖从1到10的任何一对数字。
输出量
文字,每张票一行,表格或数字之间的空格
谁赢
效率最高的程序获胜(即,针对上述参数生成票证最少的程序):
min_lottery_tickets(50, 5, 3)
谢谢!
相关的。
—
彼得·泰勒
这个问题需要各种澄清。您是追求程序,功能还是两者中的一个?输出格式重要吗?数字是否必须从1开始索引,还是可以从0开始索引?客观的获胜条件是什么?
—
彼得·泰勒
@xem这几乎属于Math SE了。他们可能会向您证明这些数字对您不利(尽管确实存在一些中奖号码,值得购买门票)
—
Cruncher
什么是好数字?
—
DavidC
我很确定,如果您实际去购买该程序输出的票证,您将损失很多钱。
—
迈克尔·汉普顿