有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
我的解:
import random
a=[]
b=[]
for x in xrange(10):
a.append(int(random.random()*1000))
b.append(int(random.random()*1000))
print a
print b
#----------------------------------------------
#----------------------------------------------
#---------------------------------------------
a=a+b
half= sum(a)/2
s=0
p=[-1]
j=half
result=[]
count=0
def do(n,m,s,p):
if n==1:
for i in xrange(m):
_t=p[-1]+i+1
_k=abs(half-s-a[_t])
global j,result,count
count=count+1
if _k<j:
j=_k
result=p+[_t]
return
else:
for i in xrange(m):
_t=p[-1]+i+1
_s=s+a[_t]
_p=p+[_t]
do(n-1,m-i-1,_s,_p)
do(10,20,s,p)
print count
print j
l=[a[x] for x in result if x+1]
print l
print sum(l),sum(a)
现在问题是 count发现遍历次数多了一半 因为如果[1,3,5]计算了,那么[2,4,6]就应该不用计算 怎然剪掉
如果 我得到 j=0那就是所求的解 怎样跳出递归
现在问题是 count发现遍历次数多了一半 因为如果[1,3,5]计算了,那么[2,4,6]就应该不用计算 怎然剪掉
如果 我得到 j=0那就是所求的解 怎样跳出递归
--
来自: `python-cn`:CPyUG ~ 华蟒用户组 | 发言:pyth...@googlegroups.com
退订: http://tinyurl.com/45a9tb //针对163/qq邮箱:http://tinyurl.com/4dg6hc
详情: https://groups.google.com/group/python-cn
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
On Dec 12, 10:41 pm, yuting cui <yuting...@gmail.com> wrote:
> 2009/12/12 Rujia Liu <rujia....@gmail.com>:> 题目说任意整形数,听上去是在暗示不要动态规划。。。。呵呵,不过也没说n很小就是了
这个算法本身就是 动态规划
题目里强调递归 是我想知道 当得到最优解(j==0)后 怎么中断递归
现在 只能在do():后面跟一句 if j==0 :return
ps:
随机20个数 能分成相等的两拨的概率有多大
我怎么每次都能得到 差为0的解
这个算法只是把所有的数交替的放到两个数组里吧。假设a,b如下:
a=[100,1]
b=[2,3]
合并,排序后的数组是:
c=[100,3,2,1]
按你的算法交替的放到两个数组里,结果是:
a=[3,1]
b=[100,2]
sum(b)-sum(a) = 98
但正确的结果应该是:
a=[100]
b=[1,2,3]
sum(a)-sum(b) = 94
解这个题的关键是考察数组元素和的值,不是数组元素的个数。
--
Best Regards,
David Shen
http://twitter.com/davidshen84/
http://meme.yahoo.com/davidshen84/
原题要求的是任意交換a, b两个序列, zeal 的解法没错
交换后,应该是
a = [100, 1]
b = [3, 2]
>>
>>
>> 解这个题的关键是考察数组元素和的值,不是数组元素的个数。
照你的思路, 如果只是要 a, b 差异最小 而不管两个序列的个数,就没什么难度了。