当前位置: 首页 > news >正文

【蓝桥杯】算法笔记6

1. 可行性剪枝应用

1.1. 题目

题目描述
给定一个正整数n和一个正整数目标值target,以及一个由不同正整数组成的数组nums。要求从nums中选出若干个数,每个数可以被选多次,使得这些数的和恰好等于target。问有多少种不同的组合方式?

输入

  • 第一行:n和target,表示数组长度和目标值

  • 第二行:n个不同的正整数,表示数组nums

输出

  • 一个整数,表示不同的组合方式数量

示例
输入:

3 4
1 2 3

输出:

4

解释:
组合方式为:
1+1+1+1
1+1+2
1+3
2+2

限制条件

  • 1 ≤ n ≤ 20

  • 1 ≤ target ≤ 1000

  • 1 ≤ nums[i] ≤ 1000

1.2. 分析

本题主要考察可行性剪枝在回溯算法中的应用。我们需要在搜索过程中及时排除不可能达到目标的分支,从而减少不必要的计算。

1️⃣排序数组:首先将数组排序,这样可以在搜索时按照一定顺序进行,便于剪枝

2️⃣回溯搜索:使用回溯法尝试所有可能的组合

3️⃣可行性剪枝

  • 当前和超过target时,立即返回

  • 从当前元素开始尝试,避免重复组合(如1+2和2+1被视为相同)

  • 剩余和无法用当前或更大的数达到时,提前终止

1.3. 代码

def combinationSum(nums, target):
    """
    计算可以达到目标值的组合数量
    :param nums: 正整数数组
    :param target: 目标值
    :return: 组合数量
    """
    nums.sort()  # 排序便于剪枝
    result = 0  # 记录结果数量
    
    def backtrack(start, remaining):
        """
        回溯函数
        :param start: 当前开始位置,避免重复组合
        :param remaining: 剩余需要凑的值
        """
        nonlocal result
        
        # 可行性剪枝1:剩余值为0,找到有效组合
        if remaining == 0:
            result += 1
            return
        
        # 可行性剪枝2:从start开始,避免重复组合
        for i in range(start, len(nums)):
            num = nums[i]
            
            # 可行性剪枝3:当前数已经大于剩余值,后面更大的数更不可能,直接终止
            if num > remaining:
                break
                
            # 递归尝试选择当前数
            backtrack(i, remaining - num)
    
    backtrack(0, target)
    return result

# 读取输入
n, target = map(int, input().split())
nums 

相关文章:

  • CubeMX配置STM32VET6实现网口通信(无操作系统版-附源码)
  • win11 nacos2.2.1 报错curl -X post 报错找不到和名称X匹配参数;不是命令
  • excel经验
  • (三十七)Dart 中使用 Pub 包管理系统与 HTTP 请求教程
  • leetcode0410. 分割数组的最大值-hard
  • 程序化广告行业(69/89):DMP与PCP系统核心功能剖析
  • STM32看门狗应用实战:独立看门狗与窗口看门狗深度解析(下) | 零基础入门STM32第九十五步
  • 详细介绍javaspringboot操控redis的高级特性1. 事务支持2. 发布/订阅3. Pipeline批量操作
  • git rebase复杂场景验证
  • QtConcurrent
  • COBOL语言的网络安全
  • AGI大模型(11):RAG系统
  • 在全球化浪潮下如何加强供应链风险管理?
  • Java全栈面试宝典:JMM内存模型与Spring自动装配深度解析
  • 数据结构实验3.1:顺序栈的基本操作与进制转换
  • 2025 年山东保安员职业资格考试要点梳理​
  • 深度学习篇---num_works选择
  • 【python以打包的形式运行和脚本形式运行获取路径注意事项】
  • GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试
  • Open CASCADE学习|读取点集拟合样条曲线(续)
  • 南京网站设计公司哪儿济南兴田德润怎么联系/免费搜索引擎入口
  • 怎么开网站做网红/开网站需要多少钱
  • 湘西网站建设吧/前端开发
  • 网络规划设计师教程(第2版)pdf/成都关键词优化服务
  • 云南省建设厅网站职称评审/项目推广方式有哪些
  • 做外贸网站卖什么好处/安徽网站设计