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

【蓝桥杯】搜索算法:剪枝技巧+记忆化搜索

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 = m

相关文章:

  • SpringBoot类跨包扫描失效的几种解决方法
  • SpringBoot企业级开发之【用户模块-登录】
  • 群晖NAS的最好的下载软件/电影的方式(虚拟机安装win系统安装下载软件)
  • 【5分钟论文阅读】InstructRestore论文解读
  • linux-core分析 : sip变量赋值-指针悬挂
  • 【LeetCode】算法详解#3 ---最大子数组和
  • 人工智能新时代:从深度学习到自主智能
  • 人工智能:深度学习关键技术与原理详解
  • LeetCode 解题思路 30(Hot 100)
  • 硬盘分区格式之GPT(GUID Partition Table)笔记250407
  • 【k8s学习之CSI】理解 LVM 存储概念和相关操作
  • 喂饭教程-Dify如何集成RAGFlow知识库
  • [ISP] ISP 中的 GTM 与 LTM:原理、算法与与 Gamma 校正的对比详解
  • Token+JWT+Redis 实现鉴权机制
  • 2024年十五届蓝桥杯青少年Scratch省赛初级组——找不同
  • 极空间NAS进阶玩法:Debian 系统安装教程
  • Docker学习--卷相关命令
  • 瓦片数据合并方法
  • 【R语言绘图】圈图绘制代码
  • 分割回文串 复原IP地址(Java)
  • 专家:家长要以身作则,孩子是模仿者学习者有时也是评判者
  • 警方通报男子广州南站持刀伤人:造成1人受伤,嫌疑人被控制
  • 长三角首次,在铁三赛事中感受竞技与生态的共鸣
  • 白天气温超30℃的北京,晚间下起了冰雹
  • 兰州大学教授安成邦加盟复旦大学中国历史地理研究所
  • 外交部:正确认识和对待历史是检验日本能否恪守和平发展承诺的重要标准