笔试编程题汇总(7)

"""
有N个商品,已知他们的价格,试判断他们中的组合是否可以正好组合出价值为M的礼包

输入描述:
    第一行:N
    第二行:N个空格分割的整数,表示价格
    第三行:M
输出描述:
    如果可以组合,输出1, 否则输出0

样例:
    input:
        6
        99 199 1999 10000 39 1499
        10238
    output:
        1
"""


import sys


def check_with_mask(price_N, price, mask):
    if price == 0:
        return True, mask, price
    for idx, data in enumerate(price_N):
        if not mask[idx]:
            continue
        if data<=price:
            rtn, mask_rtn, price_rtn = check_with_mask(price_N, price-data, mask[:idx]+[False]+mask[idx+1:])
            if rtn:
                price = price_rtn
                mask = mask_rtn
                return True, mask, price
            else:
                continue
    return False, mask, price


def check_price(price_N, price):
    mask = [True]*len(price_N)
    rtn, mask, price = check_with_mask(price_N, price, mask)
    return (1 if rtn else 0)



if __name__=="__main__":
    line1 = sys.stdin.readline().strip()
    line2 = sys.stdin.readline().strip()
    line3 = sys.stdin.readline().strip()

    N = list(map(int, line1.split()))[0]
    price_N = list(map(int, line2.split()))
    price = list(map(int, line3.split()))[0]
    
    print(check_price(price_N, price))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值