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

**回溯法在两个经典问题(0-1背包、n皇后)中的应用**的清晰解读,涵盖了搜索树结构、剪枝策略、可行解识别与核心约束条件

回溯法在两个经典问题(0-1背包、n皇后)中的应用的清晰解读,涵盖了搜索树结构、剪枝策略、可行解识别与核心约束条件。以下是对该内容的要点提炼与补充说明

0-1 背包问题(回溯法)关键点

  • 解空间为深度为n的二叉树(每个物品选/不选),共2n2^n2n个叶结点;
  • “上界”(bound)通常用贪心近似(如剩余容量内按单位价值最优装入)估算,用于剪枝——若当前上界 ≤ 当前最优解价值,则整棵子树可剪;
  • 示例中找到5个可行解,其中X5=(1,1,1,0,1,1,0,0)X_5 = (1,1,1,0,1,1,0,0)X5=(1,1,1,0,1,1,0,0)价值159为最优,说明剪枝有效避免了遍历全部28=2562^8 = 25628=256种组合。

n 皇后问题(回溯法)关键点

  • 解空间是排列树(每行1个皇后,列位置待定),规模为n!n!n!,远小于nnn^nnn
  • 冲突检测三要素:
    • 列冲突:col[j] == true
    • 主对角线(左上→右下):i - j == x - y→ 可用diag1[i-j+n-1]数组标记(偏移防负索引);
    • 副对角线(右上→左下):i + j == x + y→ 可用diag2[i+j]标记;
  • 回溯本质是“试错+撤销”,每次递归深入一行,失败则return并恢复状态(回退列/对角线标记)。

共性与考点升华

  • 回溯法 =系统性穷举 + 智能剪枝
  • 剪枝依据:约束函数(如n皇后列/斜线冲突)和限界函数(如背包价值上界);
  • 时间复杂度虽最坏仍为指数级,但实际性能高度依赖剪枝效率。
# n皇后问题Python回溯模板(含冲突检测优化)defsolve_n_queens(n):res=[]cols,diag1,diag2=[False]*n,[False]*(2*n-1),[False]*(2*n-1)defbacktrack(row,path):ifrow==n:res.append(path[:])returnforcolinrange(n):d1,d2=row-col+n-1,row+col# 主/副对角线索引ifnot(cols[col]ordiag1[d1]ordiag2[d2]):# 选择cols[col]=diag1[d1]=diag2[d2]=Truepath.append(col)# 递归backtrack(row+1,path)# 撤销path.pop()cols[col]=diag1[d1]=diag2[d2]=Falsebacktrack(0,[])returnres

在0-1背包问题的回溯法中,价值上界(bound)的作用是:对当前部分选择(前iii个物品已决策)下的剩余子问题,快速估算其可能获得的最大价值上限。若该上界 ≤ 当前已知最优解价值,则可安全剪枝,跳过整棵子树。

最常用且高效的上界计算方法是:
基于贪心策略的连续背包上界(Greedy Bound / Fractional Knapsack Bound)
——即将剩余未考虑物品按单位价值(vj/wjv_j/w_jvj/wj)降序排序后,尽可能多地装入(允许取物品的一部分),所得总价值即为当前节点的价值上界。

📌 贪心上界公式(数学表达)

设当前已处理前iii个物品,当前重量为cwcwcw,当前价值为cvcvcv
剩余物品集合为{(wi+1,vi+1), (wi+2,vi+2), …, (wn,vn)}\{ (w_{i+1}, v_{i+1}),\, (w_{i+2}, v_{i+2}),\, \dots,\, (w_n, v_n) \}{(wi+1,vi+1),(wi+2,vi+2),,(wn,vn)}
将其按单位价值rj=vj/wjr_j = v_j / w_jrj=vj/wj非递增排序,得到重排序列(w1′,v1′), (w2′,v2′), …, (wn−i′,vn−i′)(w'_1, v'_1),\, (w'_2, v'_2),\, \dots,\, (w'_{n-i}, v'_{n-i})(w1,v1),(w2,v2),,(wni,vni)
令剩余容量r=W−cwr = W - cwr=WcwWWW为背包总容量)。

价值上界为:

[
\text{bound} = cv + \sum_{k=1}^{t-1} v’k ;+; \frac{r - \sum{k=1}^{t-1} w’_k}{w’_t} \cdot v’_t
]

其中ttt是满足
[
\sum_{k=1}^{t-1} w’k \leq r < \sum{k=1}^{t} w’_k
]
的最小下标(即前t−1t-1t1个完整装入后,第ttt个只能装一部分);
rrr足够大,能装完所有剩余物品,则t=n−i+1t = n-i+1t=ni+1,此时最后一项为 0,bound =cv+∑k=1n−ivk′cv + \sum_{k=1}^{n-i} v'_kcv+k=1nivk

简化实现技巧:预处理时对全部物品按单位价值排序,并预计算后缀价值和、后缀重量和,或在线用指针扫描,时间复杂度O(n)O(n)O(n)每节点(可接受,因剪枝大幅减少节点数)。

💡 示例说明(简略)

假设剩余容量r=10r = 10r=10,剩余物品(已按v/wv/wv/w排序):

  • 物品A:w=4,v=40w=4, v=40w=4,v=40→ 单位价值10
  • 物品B:w=7,v=42w=7, v=42w=7,v=42→ 单位价值6
  • 物品C:w=5,v=25w=5, v=25w=5,v=25→ 单位价值5

→ 先装A(cw′=4,cv′=40cw'=4, cv'=40cw=4,cv=40),剩容量6;
→ B需7 > 6,故装67\frac{6}{7}76个B → 贡献价值42×67=3642 \times \frac{6}{7} = 3642×76=36
→ 上界 =cv+40+36=cv+76cv + 40 + 36 = cv + 76cv+40+36=cv+76

⚠️ 注意:该上界一定 ≥ 最优0-1解价值(因连续放松比离散更优),故可用于安全剪枝。

http://www.jsqmd.com/news/412573/

相关文章:

  • Learning on the Manifold: Unlocking Standard Diffusion Transformers withRepresentation Encoders
  • **分支限界法(结合回溯思想)求解0-1背包问题**的核心流程与结果
  • 20260225 之所思 - 人生如梦
  • build_fsd_luyan_from_rm——注释
  • 回溯法的两种实现方式(迭代与递归)本质上都是对解空间树进行深度优先搜索(DFS),区别在于控制搜索过程的机制不同
  • WPF implement DelCommand inherited from ICommand from scratch
  • **0-1 背包问题的分支限界法(Branch and Bound)求解框架**,核心融合了**贪心松弛上界估计**与**精确剪枝策略**
  • N9e配置电话告警,实现故障的电话(语音)通知
  • Grafana + Loki 使用说明
  • windows上子系统WSL下载和使用
  • linux系统 Qt 通常的目录结构
  • 算法备案分类详细及合规要点整理(2026年更新版)
  • MySQL数据库从win导出成_db.sql复制到linux
  • EC2 使用 dnsmasq 本地缓存 + EKS 使用 NodeLocalDNS
  • 基于 Kubernetes + Helm 部署高可用 ETCD 集群
  • OS 核心知识点全解析(一)
  • Redis 迁移方案-RedisShake
  • qml可拖动折线图
  • 【linuxqt】qsql_mysql.cpp:57:10: fatal error: QtSql/private/qsqldriver_p.h: No such file or directory
  • 我草我怎么这么牛
  • 基于 AWS Global Accelerator 实现全球低延迟访问-RapidX 全球加速方案
  • day96(2.25)——leetcode面试经典150
  • 【Linux】进程的页表详解
  • YOLO26最新创新改进系列:主干网络全新设计——EfficientNetV2-BackBone ,引入渐进式学习策略、自适应正则强度调整机制,共同优化训练速度和参数效率,全方位提升模型检测性能!!
  • YOLO26最新创新改进系列:融入AKConv(可改变核卷积),加强特征提取,任意数量的参数和任意采样形状,为网络开销和性能之间的权衡提供了更丰富的选择。 拉升检测性能!
  • 瑞芯微开发板开机自启动设置
  • FastAsyncWorldEdit zh-cn strings.json 中文汉化
  • **0-1 背包问题中回溯法的搜索过程、通用解题步骤及两种算法实现框架(递归与非递归)**,是算法设计与分析中的经典范例
  • SRE 团队体系建设之路
  • 惊叹!大数据数据增强如何颠覆传统模式