Tom和Sally每人都有50个哈密瓜,每个哈密瓜的重量均为0到1500盎司(包括0到1500盎司)。他们每人随意包装20个他们自己的哈密瓜。考虑到所有100个canteloupes的重量,Tom的包重量至少是Sally的重量的几率是多少?
我将这个问题建模为一个函数,它接受两个大小为50的int数组作为输入,并返回一个从0到1的double。我试图列出数组中值的所有大小为20的组合然后,对于每个汤姆的重量组合,循环所有莎莉的组合,并计算多少不到汤姆的袋重量的1.5倍。但是,这种方法已被证明太慢了。
有更快的方法吗?或者我辞职了,我相信指数方法。
答案 0 :(得分:3)
由于C(50,20)= 47,129,212,243,960,但1500x20 = 30,000, 构建两个数组(对于Tom和Sally)更有用,每个数组大小为30,000,并在每个索引中计算 i 组合的数量(在总C(50,20)中)组合)总重<em> i 。
使用此类阵列比较S(Sally)&lt; 1.5 * S(Tom)的概率是一项可管理的任务。
主要问题是我们能否比计算47,129,212,243,960总和更快地构建这样的数组?换句话说 - 我们能否有效地找出20个大小的子集总数达到30,000个可能值中的任何一个?
在这种情况下,子集和问题的动态编程方法非常实用,因为它只需要50 * 20 * 1500算术运算。
答案 1 :(得分:2)
生成函数的乐趣:让t_i成为汤姆的第i个哈密瓜的重量,s_i是莎莉的第i个哈密瓜的重量。计算多项式T(x,y)= product_i(1 + x y ^ t_i)和S(x,y)= product_i(1 + x y ^ s_i)。 x ^ k y ^ 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的系数是汤姆的体重减去1.5倍萨利的体重等于0.5 delta的方式的数量。返回y的非负幂的系数之和除以y的所有幂的系数之和。
这只是哈密瓜总重量中的弱多项式,但这里似乎已经足够了。