您的位置:首页 > 编程语言 > Python开发

腾讯马拉松之数列求和(python 实现)

2012-09-08 22:34 363 查看


数列求和





返回比赛首页

给定n个数字和一个范围[x,y],求从这n个数字中任意取出一些数字,使得它们的和在范围[x,y]中有多少种取法。

输入:

输入第一行为整数case,case<=10 表示有case组测试数据。

对于每一组测试数据,第一行为一个整数n (n<=30),第二行为n个整数a[i],第三行为两个整数x和y。其中,a[i]>=0,sum(a[i])<2^31,0<x,y<sum(a[i]).<x,y<sum(a[i])<
span="">

输出:

对于每组数据输出一行,总的取法数。

样例输入:

2

3

1 2 4

1 7

3

1 2 4

2 5

样例输出:

7

4

(Hint: 比如有3个数字 有8种不同的取法)

f=open("c:/num.txt",'r')
record = f.readlines()
for i in record:
print i
group = int(record[0])
record = record[1:]
for ii in range(0,group):
num = int(record[0])
numList = [int(i) for i in record[1].strip('\n').split(' ')]
x,y = [int(i) for i in record[2].strip('\n').split(' ')]
record = record[3:]
c = cal(num,numList,x,y)
print c
def val(l,x,y):
sum = 0
for i in l:
sum += i
if sum >= x and sum <= y:
return 1
else:
return 0

def combin(items, n=None):
if n is None:
n = len(items)
for i in range(len(items)):
v = items[i:i+1]
if n == 1:
yield v
else:
rest = items[i+1:]
for c in combin(rest, n-1):
yield v + c

def cal(num,numList,x,y):
count = 0
for i in range(len(numList)):
for j in combin(numList, i+1):
if val(j,x,y):
count +=1
return count
f.close()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: