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

双向搜索

如果问题不但具有“初态”,还具有明确的“终态”,并且从初态开始搜索与从终态开始逆向搜索产生的搜索范围能覆盖整个问题的状态空间,在这种情况下,可以采用双向搜索——从初态和终态出发各搜索一半状态,使得两边的搜索深度减半,在中间交会、组合成最终的答案

image

例题:P10484 送礼物

这个问题的直接解法就是进行“指数型”的枚举——搜索每个礼物选还是不选,时间复杂度为 \(O(2^N)\)。当然,若搜索过程中已选的礼物重量之和已经大于 \(W\),可以及时剪枝。

但是此题 \(N \le 45\)\(2^{45}\) 的计算量很大。这时就可以利用双向搜索的思想,把礼物分成两半。

首先,搜索出从前一半礼物中选出若干个,可能达到的 \(0 \sim W\) 之间的所有重量值,存放在一个数组中,并对数组进行排序、去重。

然后,进行第二次搜索,尝试从后一半礼物中选出一些。对于每个可能达到的重量值 \(w\),在第一部分得到的数组中二分查找 \(\le W-w\) 的数值中最大的一个,用二者的和更新答案。

这个算法的时间复杂度就只有 \(O(2^{N/2} \log 2^{N/2}) = O(N \cdot 2^{N/2})\) 了,还可以加入一些优化,进一步提高算法的效率,比如把礼物按照重量降序排序后再分半、搜索。

参考代码
#include <cstdio>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;
int g[50], mid, n, maxw, ans;
vector<int> w;
// 第一阶段 DFS:搜索前 mid 个物品的所有可能重量组合
void dfs1(int u, int sum) {if (u == mid) {w.push_back(sum);return;}// 不选当前物品dfs1(u + 1, sum);// 选当前物品(需判断是否超过 maxw)if (sum <= maxw - g[u]) {dfs1(u + 1, sum + g[u]);}
}
// 第二阶段 DFS:搜索剩余物品,并结合第一阶段结果更新最大值
void dfs2(int u, int sum) {if (u == n) {// 二分查找第一个使得 w[i] + sum <= maxw 的最大 w[i]int t = maxw - sum;auto it = upper_bound(w.begin(), w.end(), t);if (it != w.begin()) {it--;ans = max(ans, sum + *it);}return;}// 不选dfs2(u + 1, sum);// 选if (sum <= maxw - g[u]) {dfs2(u + 1, sum + g[u]);}
}
int main()
{scanf("%d%d", &maxw, &n);for (int i = 0; i < n; i++) scanf("%d", &g[i]);// 优化:从大到小排序,优化搜索效率sort(g, g + n, greater<int>());mid = n / 2;// 执行第一阶段dfs1(0, 0);// 对结果排序并去重,方便二分查找sort(w.begin(), w.end());w.erase(unique(w.begin(), w.end()), w.end());ans = 0;// 执行第二阶段dfs2(mid, 0);printf("%d\n", ans);return 0;
}
http://www.jsqmd.com/news/357546/

相关文章:

  • Qwen2.5-VL-7B-Instruct参数详解:Flash Attention 2推理模式切换与显存监控
  • Qwen-Image-Lightning与LangChain构建智能内容创作流水线
  • 2026年热门的硬质快速卷帘门/密封卷帘门厂家推荐与采购指南 - 品牌宣传支持者
  • AI智能文档扫描仪应用场景:合同扫描隐私保护实战落地
  • 2026年厨兴源学院路店特色唐山菜有哪些,卫生状况好不好你知道吗 - 工业品牌热点
  • DeepSeek-R1与Qwen-1.5B对比评测:谁更适合CPU端侧部署?
  • Qwen3-ASR-1.7B GPU算力方案:单卡4GB显存跑通高精度ASR的硬件选型与调优清单
  • SeqGPT-560M轻量模型优势:560M参数实现高精度,GPU显存仅需4GB
  • 分析2026年好的倍速链流水线制造商,推荐几家靠谱的 - mypinpai
  • AI读脸术故障恢复机制:自动重启与容错策略配置
  • 嵌入式开发:在Ubuntu上部署Anything to RealCharacters 2.5D引擎
  • Qwen2.5-7B-Instruct GPU优化:显存不足时自动CPU卸载的实测效果
  • Qwen2.5-VL在零售分析中的应用:顾客行为识别
  • 深聊ISO认证机构,ISO认证机构成功案例与费用情况 - 工业推荐榜
  • GTE文本向量与MySQL集成:构建企业级语义搜索系统
  • 软件测试视角下的AnythingtoRealCharacters2511质量保障实践
  • 2026年固安性价比高的有实力包车专业公司,资质齐全的包车机构推荐 - 工业品网
  • Qwen3-TTS-12Hz-VoiceDesign入门必看:10语种切换逻辑与混合文本处理技巧
  • MedGemma多模态模型实战教程:科研场景下CT影像异常识别全流程演示
  • Pi0机器人控制中心GPU算力优化:FP16推理+显存复用降低30%占用
  • 2026年济南、泰安等地全屋定制费用大揭秘,济南腾昕全屋定制报价透明吗 - myqiye
  • GLM-Image Web交互界面实操手册:支持2048×2048超分生成的完整流程
  • 高清生成作品:户外运动装备雪地模式视觉化改写结果
  • 探寻理优清北教育学员升学情况,价格贵不贵?反馈是否良好 - 工业设备
  • Qwen2.5-VL Java开发实战:SpringBoot集成视觉定位API
  • 2026年热门的高速冲压/冲压行业内口碑厂家推荐 - 品牌宣传支持者
  • AIGlasses_for_navigationGPU算力:FP16推理使RTX4090吞吐量提升2.3倍
  • ChatGLM3-6B效果实录:多轮技术问答中自动关联历史提问并补充上下文
  • GTE中文嵌入模型实操手册:向量归一化、余弦相似度阈值设定与业务规则融合
  • Granite-4.0-H-350m在医疗领域的自然语言处理应用