蓝桥杯:盾神与砝码称重 递归 +剪枝解法

博客探讨了如何使用递归和剪枝优化解决蓝桥杯竞赛中的砝码称重问题。通过转换思路,将问题拆分为子问题,避免穷举所有组合,从而提高效率。文章提供了AC完整代码,并给出了样例输入和输出。
摘要由CSDN通过智能技术生成

蓝桥杯:盾神与砝码称重 递归 +剪枝解法

问题描述

有一天,他在宿舍里无意中发现了一个天平!这个天平很奇怪,有n个完好的砝码,但是没有游码。盾神为他的发现兴奋不已!于是他准备去称一称自己的东西。他准备好了m种物品去称。神奇的是,盾神一早就知道这m种物品的重量,他现在是想看看这个天平能不能称出这些物品出来。但是盾神稍微想了1秒钟以后就觉得这个问题太无聊了,于是就丢给了你。
输入格式
  第一行为两个数,n和m。
  第二行为n个数,表示这n个砝码的重量。
  第三行为m个数,表示这m个物品的重量。
输出格式
  输出m行,对于第i行,如果第i个物品能被称出,输出YES否则输出NO。
样例输入

4 2

1 2 4 8

15 16

样例输出

YES

NO

样例输入

4 1

10 7 1 19

6

样例输出

YES

数据规模和约定
  1<=n<=24, 1<=m<=10.

思路

一开始我是这样的:对于每一种砝码,都有三种选项

  1. 将砝码放在放置物品的盘中
  2. 将砝码放在物品对面的盘中
  3. 不使用这个砝码

那么对于n个砝码,我们会有 长度为n的三进制串唯一地表示一种放置砝码的组合
0, 1, 2 对应:放置在物品盘,放置在物品盘对面,不使用
穷举所有组合,对每一种组合得到的重量,判断给定重量是否在其中,然后输出
然后你会发现 没 有 时 间 了
在这里插入图片描述

思路转换

其实不需要穷举所有的解,可以做以下优化:
思路由穷举转换为拆分问题

约定:假设第 i 个砝码的重量 为 fm(i)(fm = fa ma = 砝码)

如果 fm(i) 不等于 m :可以将问题拆分为子问题:

问题【前 i 个砝码能否表示某个重量 m 】等效于: 【前 i-1 个砝码能否表示重量 m】或 【前 i-1 个砝码能否表示重量 m + fm(i)】或【前 i-1 个砝码能否表示重量 m - fm(i)】

剪枝优化

  • 如果找到了解,就提前结束
  • 对砝码的重量升序排序
  • 如果前 i 个备选砝码加起来都没有当前重量大,直接判断无解

AC完整代码

#include <iostream>

using namespace std;

#define maxlen 28
int n, m;
int fm[maxlen];		// fm[i] 表示第i个砝码的重量 
int fm_sum
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值