(Python)求符合条件元组个数

给定一个整数数组 nums 、一个数字 k、一个整数目标值 target,请问 nums 中是否存在 k 个元素使得其相加结果为 target,请输出所有符合条件且不重复的 k 元组的个数

输入:

第一行是 nums 取值:2 7 11 15

第二行是 k 的取值:2

第三行是 target 取值: 9

输出:

1

说明:

[2,7]满足,输出个数是 1

解题思路:

通过回溯法找出数组 nums 中符合要求的 k 元组,使其相加结果为 target,并统计符合条件且不重复的 k 元组个数。

回溯法python框架:

result= []
def backtrace(选择列表nums, 路径列表trace):
    if 满足约束条件:
        result.append(路径 trace.copy())
        return
    for 选择 in 选择列表nums:
        做选择trace.append()
        backtrace(剩余选择列表, 路径)
        撤销选择trace.pop()

题解:

def combine(nums, target, k):
    result = []
    trace = []

    def backtrace(nums, trace, k):
        if len(trace) == k and sum(trace) == target:
            result.append(trace.copy())
            return

        for i in range(len(nums)):
            if len(trace) >= k:  # 剪枝
                break
            trace.append(nums[i])
            backtrace(nums[i + 1:], trace, k)
            trace.pop()

    backtrace(nums, trace, k)
    result_tmp = [sorted(x) for x in result]
    result = [x for i, x in enumerate(result_tmp) if x not in result_tmp[:i]]  # 去重
    print(len(result))


if __name__ == "__main__":
    nums = list(map(int, input().split()))
    k = int(input())
    target = int(input())
    combine(nums, target, k)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值