算法:講一個list拆分爲兩個list,並使兩個list和的差的絕對值最小

題目:輸入兩個長度爲n的list A,B,通過交換兩個list的值,獲得兩個新的list,要求這兩個list和的差值的絕對值最小:min:abs(sum(A)-sum(B))


在不要求交換後A,B長度相等的條件下,可以使用動態規劃的思路求解:

首先計算sum(A + B),求得sum / 2然後,利用0,1揹包思路,填充一個最大容量爲sum / 2的揹包,並獲得填包的最好情況,那麼所求值即爲:min sum(A+B)- 2 * result

動態規劃遞推式爲:

R(n,w)= max(R(n-1, w), R(n-1,w-List(n))+ List(n))

代碼如下:

# encoding: GBK

'''

Created on 2014年1月20日


@author: xiaolubambi

'''


def divde_list(a, b):

   '''

       將兩個列表分成 兩份 ,使得兩份的和的差的絕對值最小

   '''

   list = a + b

   list = sorted(list)

   length = len(list)

   sum_dive2 = sum(list) / 2

   result = [[0 for x in range(sum_dive2 + 1)] for y in range(length)]

   for j in range(1, sum_dive2 + 1):

       if j >= list[0]:

           result[0][j] = list[0]


   for i in range(1, length):

       for j in range(1, sum_dive2 + 1):

           max = 0

           if j - list[i] >= 0:

               if result[i - 1][j] > result[i - 1][j - list[i]] + list[i]:

                   max = result[i - 1][j]

               else:

                   max = result[i - 1][j - list[i]] + list[i]

           else:

               max = result[i - 1][j]

           result[i][j] = max

   return abs(sum(a + b) - result[i][j] * 2)



if __name__ == '__main__':

   a = [1, 2]

   b = [1000, 1000]

   result = divde_list(a, b)

   print result


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章