题目描述
一个数组中有若干正整数,将此数组划分为两个子数组,使得两个子数组各元素之和a,b的差最小,对于非法输入应该输出ERROR。
输入
数组中的元素
输出
降序输出两个子数组的元素和
样例输入
10 20 30 10 10 10 20 abc 10 10
样例输出
40 40 ERROR
思路:
令sum为集合中所有的元素之和,当子集合的和接近 sum/2 时,两个子集合的和相差最小
用DP的背包思想来考虑这个问题:把 sum/2 看作是背包的容量V,把元素的数值看作是占用背包的空间与得到的价值,例如,元素值是K,那么占用背包大小是K,得到的价值也是K。这样的话,只要我们拿着容量为V的背包,收集到最大的价值,就是最接近 sum/2 的数。
令第一个子集合的和为“背包收集到的最大价值”A,则第二个集合的和就是sum-A