近似于分数之和

时间:2016-10-31 04:21:17

标签: algorithm math sum fractions

假设添加分数a / b和c / d的结果是(a + c)/(b + d)。类似地,添加3个分数a / b,c / d,e / f的结果是(a + c + e)/(b + d + f),等等。 我有以下无法解决的问题。

给定具有n个分数a1 / b1,a2 / b2,...,a / bn的数组A,数字k <1。 n,和分数c / d。 我需要测试是否有可能采用恰好k个索引{i1,i2,...,ik}这样的方式A [i1] + A [i2] + ... + A [ik]&gt;的总和。 = c / d。 如果可以,则打印索引。

例如: 如果你有分数1 / 4,300 / 600,400 / 400,k = 2和c / d = 400/400 然后答案是否定的。 另一方面,如果c / d = 400/404,那么答案是1和3,因为1/4 + 400/400 = 401/404> = 400/404。

谢谢!

2 个答案:

答案 0 :(得分:1)

注意,如果0 <= a / b <= c / d,则(a + c)/(b + d)<= c / d。因此,您需要做的就是遍历整个数组,寻找最大分数。这是一个线性时间操作,因为它避免了整个数组排序的瓶颈。

这是声明的证明。假设存在2个正有理数a / b,c / d,使得a / b <= c / d。请注意,ad&lt; = bc,这意味着ad + cd&lt; = bc + cd。这相当于说(a + c)d <= c(b + d),这意味着(a + c)/(b + d)<= c / d。因此,您的子集和(如您定义的那样)受数组中最大正分数的限制。因此,您需要做的就是找到数组中的最大分数(称之为maxP)并返回max(maxP,0),假设允许空子集。

答案 1 :(得分:0)

这看起来像是背包问题的变种。尝试最大化k个分数的总和(取k项以使值最大化)并查看是否超过c / d。

同样在计算数值时,请使用(a+b)/(c+d)等,而不是总结各自的值。