繁体   English   中英

汤姆的包比萨莉的包重多少?

[英]How likely will Tom's bag be heavier than Sally's bag?

汤姆(Tom)和莎莉(Sally)各自有50个哈密瓜,它们的重量介于0到1500盎司(含)之间。 他们每个人都随机袋装20个自己的哈密瓜。 给定所有100个长面包片的重量,汤姆的包至少重达莎莉1.5倍的概率是多少?

我将此问题建模为一个函数,该函数将两个大小均为50的int数组作为输入,并从0到1返回一个双精度值。我试图列出大小为20的所有组合作为数组中的值,然后列出Tom的每种组合重量,遍历Sally的所有组合,并计算出有多少个重量小于Tom的行李重量的1.5倍。 但是,这种方法已被证明太慢了。

有没有更快的方法? 还是我辞职了,我相信指数方法。

由于C(50,20)= 47,129,212,243,960,但1500x20 = 30000,这将是建立两个阵列(对于Tom和Sally的),每个大小30000的更有用的,并且在每个索引i的组合的数量计数(在总C(50,20)组合),总权重为i

使用这样的数组比较S(Sally)<1.5 * S(Tom)的概率是一项可管理的任务。

主要问题是,与构建47,129,212,243,960个总和相比,我们可以更快地构建这样的数组吗? 换句话说-我们能否有效地找出30,000个可能值中有多少个大小为20的子集之和?

在这种情况下,对子集和问题进行动态编程的方法非常实用,因为它仅需要50 * 20 * 1500个算术运算。

生成函数的乐趣:令t_i为Tom的第i哈密瓜的权重,而s_i为Sally的第i哈密瓜的权重。 计算多项式T(x,y)= product_i(1 + xy ^ t_i)和S(x,y)= product_i(1 + xy ^ s_i)。 x ^ ky ^ w的系数是选择总重量为w的k个哈密瓜的方法的数量。 设T20(y)为T(x,y)中x ^ 20的系数,S20(y)为T(x,y)中x ^ 20的系数。 计算乘积T(y ^ 2)S(y ^ -3)。 y ^ delta的系数是Tom的体重减去1.5倍Sally的体重等于0.5 delta的方式的数量。 返回y的非负幂的系数总和除以y的所有幂的系数总和。

这仅是哈密瓜总重量中的弱多项式,但这似乎足够好了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM