腾讯马拉松之数列求和(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()        



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值