数列求和
给定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()