騰訊馬拉松之數列求和(python 實現)

數列求和

返回比賽首頁

給定n個數字和一個範圍[x,y],求從這n個數字中任意取出一些數字,使得它們的和在範圍[x,y]中有多少種取法。

輸入:

輸入第一行爲整數casecase<=10 表示有case組測試數據。

對於每一組測試數據,第一行爲一個整數n (n<=30),第二行爲n個整數a[i],第三行爲兩個整數xy。其中,a[i]>=0sum(a[i])<2^310<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()        



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章