当前位置: 首页 > 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 += 1return# 可行性剪枝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

http://www.mrgr.cn/news/97595.html

相关文章:

  • [蓝桥杯] 求和(C语言)
  • 剑指Offer(数据结构与算法面试题精讲)C++版——day7
  • 【蓝桥杯】动态规划:线性动态规划
  • IntelliJ IDEA下开发FPGA——FPGA开发体验提升__下
  • JVM基础架构:内存模型×Class文件结构×核心原理剖析
  • PythonJSON解析如何优雅处理嵌套JSON字符串
  • springboot中使用async实现异步编程
  • 【蓝桥杯】动态规划背包问题
  • Go语言从零构建SQL数据库(5)-Pratt解析算法:SQL表达式解析的核心引擎
  • 算法与数据结构线性表之栈和队列
  • Docker与VNC的使用
  • PPTAgent:一款开源免费生成和评估幻灯片的项目
  • Linux信号——信号的保存(2)
  • Linux信号——信号的处理(3)
  • QT6(12)3.3.1 Qt元对象系统概述:QObject 类与 QMetaObject 类,类型转换 qobject_cast<T>()。3.3.3 属性系统:帮助文档,
  • 【题解-Acwing】798. 差分矩阵
  • 【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【代码篇】A题解题全流程(持续更新)
  • vue3 处理文字 根据文字单独添加class
  • linux第三次作业
  • JVM核心机制:类加载×字节码引擎×垃圾回收机制