蓝桥杯 之 回溯之充分剪枝

文章目录

  • 在蓝桥杯当中,对于回溯是属于一个必考的问题,但是除了回溯的几个基本的问题,如果通过剪枝来提前删去无效的分支,以大大减少时间复杂度是需要我们进一步思考的问题!

  • 回溯的基本问题:

    • 回溯的初始状态
    • 回溯的状态转移
    • 回溯的结束状态
  • 其中,这个剪枝的考点就可以在结束状态部分进行充分的考察

  • 那么这个剪枝有哪些思路与思考?

    • 对于这个n个物体,求和的回溯问题:可以考虑使用前缀和,排序两个手段进行提前剪枝(以真题买瓜进行深入的分析)

买瓜

买瓜

  • 首先按照正常的回溯的思路:

    • 首先考虑在回溯的过程中,我们需要记录什么参数?
      • 由于要更新这个最终的切西瓜的刀数,所以得设置一个变量记录当前的切西瓜的刀数
      • 那么当前是切的哪一个西瓜?所以还得记录一下这个所处理的西瓜的下标
      • 那么怎么知道当前的得到的西瓜的重量?所以还得设置一个变量去记录当前所得到的西瓜
    • 总的来说,回溯的过程中,需要三个变量(i, k, cursum),分别表示当前处理到的西瓜的下标,当前已经切的西瓜刀数,当前得到的西瓜的重量
  • 考虑这个结束的状态与更新答案的状态

    • 结束的状态:当处理到的西瓜的下标达到n的时候,就返回(因为西瓜的下标是从0开始的,所以当处理到的西瓜的下标到达n就说明已经处理完了)
    • 更新的状态:当当前的重量等于目标重量的时候,就比较当前的切西瓜的次数与当前的切西瓜的最优次数,进行一个更新
  • 由于有除以2的操作,所以我们可以将这个目标都扩大两倍,同时将这个西瓜重量也扩大两倍,这样就不用除以2

python 复制代码
# 对于每个西瓜,可以选择切与不切
n, m = map(int, input().split())
m = m<<1 
num = list(map(int, input().split()))
a = [i*2 for i in num]
ans = n+1
# 当前的瓜的下标,当前切的刀数,当前的重量
def dfs(i, k, cursum):
    global ans
    if cursum == m:
        ans = min(ans, k)
    if i == n:
        return
    # 不选
    dfs(i + 1, k, cursum)
    # 选择,如果当前的cursum 没有超过这个m
    if cursum + num[i] > m:
        return
    # 选择一整个西瓜
    dfs(i + 1, k, cursum + a[i])
    # 选择半个西瓜
    dfs(i + 1, k + 1, cursum + num[i])
dfs(0,0,0)
print(ans if ans != n+1 else -1)
相关推荐
Yzzz-F21 小时前
P4145 上帝造题的七分钟 2 / 花神游历各国[线段树 区间开方(剪枝) + 区间求和]
算法·机器学习·剪枝
_OP_CHEN2 天前
【算法基础篇】(四十四)数论之欧拉定理与扩展欧拉定理深度解析:从降幂到超大规模幂运算
c++·算法·蓝桥杯·算法竞赛·欧拉定理·扩展欧拉定理·acm/icpc
2301_800895102 天前
hh蓝桥杯每日一题
职场和发展·蓝桥杯
2503_946971862 天前
【BruteForce/Pruning】2026年度物理层暴力破解与神经网络剪枝基准索引 (Benchmark Index)
人工智能·神经网络·算法·数据集·剪枝·网络架构·系统运维
CCPC不拿奖不改名3 天前
python基础:python语言中的函数与模块+面试习题
开发语言·python·面试·职场和发展·蓝桥杯
_OP_CHEN3 天前
【算法基础篇】(四十二)数论之欧拉函数深度精讲:从互质到数论应用
c++·算法·蓝桥杯·数论·欧拉函数·算法竞赛·acm/icpc
小芒果_013 天前
P8662 [蓝桥杯 2018 省 AB] 全球变暖
c++·算法·蓝桥杯·信息学奥赛
源来猿往4 天前
yolov8n结构化剪枝
算法·yolo·剪枝
tongxianchao4 天前
MetaPruning: Meta Learning for Automatic Neural Network Channel Pruning
算法·机器学习·剪枝
_OP_CHEN4 天前
【算法基础篇】(四十三)数论之费马小定理深度解析:从同余性质到乘法逆元
c++·算法·蓝桥杯·数论·acm/icpc