Chinaunix首页 | 论坛 | 博客
  • 博客访问: 250774
  • 博文数量: 35
  • 博客积分: 198
  • 博客等级: 入伍新兵
  • 技术积分: 443
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-28 10:30
文章分类

全部博文(35)

文章存档

2015年(5)

2014年(14)

2013年(8)

2012年(7)

2011年(1)

我的朋友

分类: Python/Ruby

2015-06-15 23:34:15

假设有数组A,B,从A,B中各抽出一个元素交换,使之 sum(A) - sum(B) 的差值最小, 解决这个问题的思路是这样的, 假设 a,b 元素交换, a 初始属于A, b初始属于B,那么差diff = sum(A) -a +b  - ( sum(B) - b +a ) = sum(A)-sum(B) -2*(a-b)  sum(A)-sum(B) 的差为常量C, diff=c-2*(a-b) ,就化解为了三元一次方程, diff 最小也就是abs(diff) = 0 的时候最小, 那么就求解 a-b=2c最小值问题,用python 代码解如下:


  1. import math
  2. class compare_value :
  3.     def __init__(self) :
  4.         self.idx_x = 0
  5.         self.idx_y = 0
  6.         self.cmp_value=0

  7. def cmp_key(objlist):
  8.     min_val=objlist[0]
  9.     for x in objlist :
  10.         if min_val.cmp_value > x.cmp_value :
  11.             min_val = x
  12.     return min_val

  13. arr_set=[1,4,2,9,-12] # set
  14. brr_set=[3,4,1,5,0] # set
  15. swap_val=() ## tuple
  16. total=sum(arr_set)+sum(brr_set)
  17. cmp_list=[];

  18. for i,x in enumerate(arr_set) :
  19.     for j,y in enumerate(brr_set) :
  20.         chr_val=abs(total-2*abs(x-y))
  21.         cmp_value=compare_value()
  22.         cmp_value.idx_x=i
  23.         cmp_value.idx_y=j
  24.         cmp_value.cmp_value=chr_val
  25.         cmp_list.append(cmp_value)
  26. ## print set
  27. print "arr_set"
  28. print arr_set
  29. print "--------------------------------------------\n"
  30. print "brr_set"
  31. print brr_set
  32. print "--------------------------------------------\n"
  33. for x in cmp_list :
  34.     print 'arr_set[%d]=[%d],brr_set[%d]=%d abs(sum(arr_set)+sum(brr_set) -2*(abs(arr_set[%d]-brr_set[%d]))) = %d' %(x.idx_x,arr_set[x.idx_x], x.idx_y, brr_set[x.idx_y], x.idx_x,x.idx_y,x.cmp_value)
  35. min_key_value=cmp_key(cmp_list)
  36. print '\n\nmin swap is arr_set[%d] an brr_set[%d]' %(min_key_value.idx_x, min_key_value.idx_y)


阅读(3117) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~