數列求和
給定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()