问一题,30分钟做完# JobHunting - 待字闺中j*d2019-07-10 07:071 楼给你一个数组,有偶数个数,要分成2个数组,每个数组所含的数的个数一样。要求两数组和的差最小。以为是背包,后来发现,无法得到2个equal size的数组。如何解决?除了greedy。
h*12019-07-10 07:076 楼排序+ greedy【在 j*****d 的大作中提到】: 给你一个数组,有偶数个数,要分成2个数组,每个数组所含的数的个数一样。要求两: 数组和的差最小。: 以为是背包,后来发现,无法得到2个equal size的数组。如何解决?除了greedy。
u*d2019-07-10 07:078 楼还是背包DP解:https://www.geeksforgeeks.org/partition-a-set-into-two-subsets-such-that-the-difference-of-subset-sums-is-minimum/
a*a2019-07-10 07:079 楼sort in reverse order, then do dfs with pruning (early return if sum isworse than current best result).【在 j*****d 的大作中提到】: 给你一个数组,有偶数个数,要分成2个数组,每个数组所含的数的个数一样。要求两: 数组和的差最小。: 以为是背包,后来发现,无法得到2个equal size的数组。如何解决?除了greedy。
p*r2019-07-10 07:0710 楼凭俺猪一样的智商,目前想到只有是暴力dfs往下撸,设一个min difference = max作为初始,然后dfs往下撸,不到n/2,就比min大的咔嚓掉到了n/2, 更新min
p*r2019-07-10 07:0711 楼为啥要sort【在 a****a 的大作中提到】: : sort in reverse order, then do dfs with pruning (early return if sum is: worse than current best result).
j*d2019-07-10 07:0713 楼我突然觉得,背包就可以做,只是,boolean[] 变成 Node【】。 node里面,2个field,reachable 一个boolean量。num 一个int,记录和为这个数的时候,用的个数?
n*g2019-07-10 07:0715 楼一个标准np hard.. 学名叫partition problem但是易dp解https://en.wikipedia.org/wiki/Partition_problem
l*r2019-07-10 07:0717 楼先排序,然后a_1,a_2,...,a_(2n-1),a_(2n)分组a_1,a_(2n),a_3,a_(2n-2),...a_2,a_(2n-1),a_4,a_(2n-3),...当n=2是可以证明a3 + a4 - a1 - a2 >= a1 + a4 - a2 - a3 >= a1 + a2 - a3 - a4a4 + a2 - a1 - a3 >= a1 + a4 - a2 - a3 >= a1 + a3 - a2 - a4所以abs(a1 + a4 - a2 - a3) <= abs(a3 + a4 - a1 - a2)abs(a1 + a4 - a2 - a3) <= abs(a2 + a4 - a1 - a3)如果n>=4,假设交换a_i,a_j (a_i with + sign and a_j with - sign with a_i <=a_j).so a_(2n-i + 1) >= a_(2n-j+1)a_(2n-i+1) + a_j - a_i -a_(2n-j+1) >= a_(2n-i+1) + a_i - a_(2n-j+1) - a_j >=a_i + a_(2n-j+1) - a_j - a_(2n-i+1)如果a_i>=a_j,则a_(2n - i + 1) <= a_(2n-j + 1)a_(2n-i+1) + a_j - a_i -a_(2n-j+1) <= a_(2n-i+1) + a_i - a_(2n-j+1) - a_j <=a_i + a_(2n-j+1) - a_j - a_(2n-i+1)所以任意交换两项都会让absolute diff变大。这个分组是最佳的。【在 j*****d 的大作中提到】: 给你一个数组,有偶数个数,要分成2个数组,每个数组所含的数的个数一样。要求两: 数组和的差最小。: 以为是背包,后来发现,无法得到2个equal size的数组。如何解决?除了greedy。
n*e2019-07-10 07:0718 楼不错<=【在 l******r 的大作中提到】: 先排序,然后a_1,a_2,...,a_(2n-1),a_(2n): 分组: a_1,a_(2n),a_3,a_(2n-2),...: a_2,a_(2n-1),a_4,a_(2n-3),...: 当n=2是可以证明: a3 + a4 - a1 - a2 >= a1 + a4 - a2 - a3 >= a1 + a2 - a3 - a4: a4 + a2 - a1 - a3 >= a1 + a4 - a2 - a3 >= a1 + a3 - a2 - a4: 所以abs(a1 + a4 - a2 - a3) <= abs(a3 + a4 - a1 - a2): abs(a1 + a4 - a2 - a3) <= abs(a2 + a4 - a1 - a3): 如果n>=4,假设交换a_i,a_j (a_i with + sign and a_j with - sign with a_i <=
w*d2019-07-10 07:0720 楼不对吧,假如是1,2,3,4,5,100。最好分组难道不是1,2,100和3,4,5?<=【在 l******r 的大作中提到】: 先排序,然后a_1,a_2,...,a_(2n-1),a_(2n): 分组: a_1,a_(2n),a_3,a_(2n-2),...: a_2,a_(2n-1),a_4,a_(2n-3),...: 当n=2是可以证明: a3 + a4 - a1 - a2 >= a1 + a4 - a2 - a3 >= a1 + a2 - a3 - a4: a4 + a2 - a1 - a3 >= a1 + a4 - a2 - a3 >= a1 + a3 - a2 - a4: 所以abs(a1 + a4 - a2 - a3) <= abs(a3 + a4 - a1 - a2): abs(a1 + a4 - a2 - a3) <= abs(a2 + a4 - a1 - a3): 如果n>=4,假设交换a_i,a_j (a_i with + sign and a_j with - sign with a_i <=
w*d2019-07-10 07:0721 楼最好的解法还是DP吧。假设F(k, n, m)表示在1到m个元素中和离k最近的n个元素,那原题就是求F(sum/2, n/2, n)。递推公式就是 F(k, n, m) = better{F(k-x_m, n-1, m-1), F(k, n, m-1)}。最后复杂度是 sum * n^2, 是pseudo-polynomia。如果整数都有bound,那就是n^3。