NO_32(数组、规划)

题目博客:

http://blog.youkuaiyun.com/v_JULY_v/article/details/6057286

题目:

有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:  
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];

。。。。卡这么好久了。。
总是写不出列表的组合来。看了别人写组合的代码,突然发现好简单啊。。

这是别人组合的代码:

def combine(l,n):
    answers=[]
    one=[0]*n
    def next_c(li=0,ni=0):
        if ni==n:
            answers.append(copy.copy(one))
            return
        for  l_index in xrange(li,len(l)):
            one[ni]=l[l_index]
            next_c(l_index+1,ni+1)
    next_c()
    return answers

#coding=utf-8
'''
Created on 2014��5��28��

@author: Administrator
'''
import itertools
import math,random,copy
def combine(l,n):
    #获取列表l n个元素的组合列表
    answers=[]
    one=[0]*n
    def next_c(li=0,ni=0):
        if ni==n:
            answers.append(copy.copy(one))
            return
        for  l_index in xrange(li,len(l)):
            one[ni]=l[l_index]
            next_c(l_index+1,ni+1)
    next_c()
    return answers


if __name__ == '__main__':
    in_list1,in_list2=[100,99,98,1,2,3],[1,2,3,4,5,40]
    #out_list1,out_list2=GetMinSubList(in_list1, in_list2)
    total_list=list(itertools.chain(in_list1,in_list2))
    total_list.sort(reverse=True)
    avg_sum=sum(total_list)/2.0#和的平均值
    min_subvalue=avg_sum#与和平均值的差值
    out_list1,out_list2=None,None
    for tmp_list in combine(total_list,5):
        if math.fabs(sum(tmp_list)-avg_sum)<min_subvalue:
            min_subvalue,out_list1=math.fabs(sum(tmp_list)-avg_sum),tmp_list
    out_list2=total_list[:]
    for value in out_list1:
        out_list2.remove(value)
    print sum(out_list1)-sum(out_list2)
    #print combine([1,2,3],2)
运行结果为:

44


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值