首页 > 其他分享 >洛谷 P8742 [蓝桥杯 2021 省 AB] 砝码称重

洛谷 P8742 [蓝桥杯 2021 省 AB] 砝码称重

时间:2023-04-02 09:56:45浏览次数:36  
标签:AB 洛谷 01 蓝桥 枚举 背包 砝码 质量 右盘

经典 01 背包题

  • 首先介绍一下 01 背包,即一种 DP 问题,以放置物品为模型,每个物品只能放一次。其区分于完全背包(每个物品可以放无限多次),以及多重背包(每个物品有一个固定次数上限)。题中给出了 $ N $ 个砝码及每个砝码的质量,要求我们求出可以称出质量的种数。由此想到转化为 01 背包
  • 本题作为 01 背包的模板题之一,其思想不难(前提是你掌握了 01 背包写法)。但是有几个坑点:
  1. 上过初一的人都知道左物右码,这个题出的很不科学。 题中重点是天平两边都能放砝码,显然,由于天平两边放砝码的质量不一定相等,所以要在较轻一侧放一个一定质量的物体使其平衡。所以显然地,设物体质量为 $ m_{thing} $,左盘砝码质量为 $ m_l $,右盘砝码质量为 $ m_r $,则有:

\[\left\{ \begin{array}{c} m_{thing}+m_l=m_r (m_l\le m_r)\\ m_{thing}+m_r=m_l (m_l\ge m_r) \end{array} \right. \]

即为:

\[ m_{thing}=|m_l-m_r| \]

  1. 注意 dp 方程转移时要从大到小转移,否则存在越界。

代码构造

  • 说了这么多,代码怎么写?有了以上结论,这变得容易了些:我们不妨设状态 $ f_{i,j} $ 表示枚举到第 $ i $ 个砝码时是否能够称出质量 $ j $。
    但是为什么这么设呢? 有些人摸不着头脑。我们不妨这么想:线性 DP 本身是要以线性方式转移状态,本题中可以看作枚举每个砝码,因此状态定义中存在砝码(即 $ i $)。本题是要求 情况总数 ,所以我们想到一个类似于桶标记的方法定义状态(即定义 $ j $ 质量)。
  • 那怎么写双重循环呢?外层循环很显然是枚举每个砝码,即将 $ i $ 从1枚举到 $ n $,但内层循环呢?其实也很简单,因为我们之前定义了 $ j $ 为枚举质量,所以我们可以将 $ j $ 从1开始枚举,枚举到所有砝码质量总和(因为质量最大就是砝码质量总和)。
  • 因此,易推得 $ f_{i,j} $ 如何转移:
  1. 如果枚举到当前的砝码不放,那么对于枚举到的每一个质量,其情况都与枚举到上个砝码时的情况相同,且此方案显然是否可行取决于上一个方案是否可行。 即 $ f_{i,j} = f_{i-1,j} $。
  2. 如果之前一个砝码也没放,现在枚举到的砝码是第一个放的(即当前枚举到的 $ j $ 就是当前枚举到的砝码质量),那么这种方案显然可行,因此 $ f_{i,j}=1(j=W_i) $。
  3. 另外的情况,我们需要分类讨论:
    第一种情况: 将当前枚举到的砝码放置在右盘,右盘质量为 $ j $,那么显然还没有放置时右盘质量为 $ |j-W_i| $。为什么加绝对值,是因为上一个砝码有可能放在左盘或右盘(这里枚举 $ j $ 为右盘质量),所以只要上一个砝码能称出 $ |j-W_i| $ 的质量,当前砝码就可以称出 $ j $ 的质量。 即当 $ f_{i-1,|j-W_i|}=1 $ 时,$ f_{i,j} = 1 $。
    第二种情况: 将当前枚举的砝码放在左盘,那么类似地,当 $ f_{i-1,j+W_i}=1 \(时,\) f_{i,j}=1 $。

因此,本题就很清楚了。至于具体代码……相信您可以凭自己实力写出来!

求过(小声)

  • Update_2023.1.29 增加了描述;
  • Update_2023.2.1 更改 $ \LaTeX $ 的排版。
  • Update_2023.2.2 在数字和汉字间加空格(笑)。

标签:AB,洛谷,01,蓝桥,枚举,背包,砝码,质量,右盘
From: https://www.cnblogs.com/ZyIOLO/p/17279958.html

相关文章

  • 洛谷 P9009 [入门赛 #9] 牵连的世界 (Hard Version) 题解
    P9009[入门赛#9],真9。这是一道hack题,即你需要自造符合题意的数据使题中所给程序无法AC。Task01看数据范围知一切,显然有\(-2\times10^9\lea_i\le2\times10^9\),因此\(a_i\)可能为负数。注意C/C++中的取模%(mod)运算实质上是为取余运算(rem)对于整型数a,b来说......
  • 洛谷 P8762 [蓝桥杯 2021 国 ABC] 123 题解
    为什么可以使用前缀和,这里提供解释:初读题目,我们发现这个数列很迷惑,似乎不能使用数学方法来解。\[1,1,2,1,2,3,1,2,3,4,\cdots\]但是,我们可以想到数形结合的方式,我们将数列看作一个三角形,于是他变成了:\[1\]\[1,2\]\[1,2,3\]\[1,2,3,4\]\[\cdots\cdots\]于是本题变得好思......
  • 洛谷P1217 [USACO1.5]回文质数 Prime Palindromes
    #include<bits/stdc++.h>usingnamespacestd;inta,b;boolzs(intx){if(x%2>0){for(inti=3;i<x;i+=2)if(x%i==0)returnfalse;returntrue;}elsereturnfalse;}boolhws(intx......
  • AtCoder Beginner Contest 296 ABCD
    https://atcoder.jp/contests/abc296A-Alternately#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18,MINN=-MAXN,INF=0x3f3f3f3f;constLLN=2e6+10,M=3023;constLLmod=100000007;cons......
  • AcWing 第 97 场周赛 ABC(dfs)
    https://www.acwing.com/activity/content/competition/problem_list/3088/果然绩点成绩和竞赛水平总得寄一个(tome4944.热身计算#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18,MINN=-MAXN,INF=0x3f3f3......
  • 实现Callable接口创建线程
    ​ 通过实现Callable接口创建线程与实现Runnable接口创建线程类似,不同之处在于Callable的call()方法可以返回一个结果,并且可以抛出异常。以下是通过实现Callable接口创建线程的示例代码:importjava.util.concurrent.Callable;publicclassMyCallableimplementsCallable<Str......
  • mutable、const、volatile关键字
    C++中有三种修饰数据可变的关键字:mutable、const、volatile。constconst我们很常见,在定义一些不可变的常量或不修改数据内容的函数时经常会用到。 修饰变量,说明该变量不可以被改变;修饰指针,分为指向常量的指针(例如constchar*,其自身可变,指向的是常量字符数组)和自身是常量的......
  • abp(net core)+easyui+efcore实现仓储管理系统——ABP升级7.3下(五十九)
    Abp(netcore)+easyui+efcore实现仓储管理系统目录abp(netcore)+easyui+efcore实现仓储管理系统——ABP总体介绍(一)abp(netcore)+easyui+efcore实现仓储管理系统——解决方案介绍(二)abp(netcore)+easyui+efcore实现仓储管理系统——领域层创建实体(三) abp(netcore)+eas......
  • The remote name could not be resolved: 'report.dalabs.cn'
    1.在做程序的时候出现System.Net.WebException:Theremotenamecouldnotberesolved:'report.dalabs.cn'百度后得到以下方法:在webconfig文件里面添加代理配置:<system.net><defaultProxy><proxyusesystemdefault="True"proxyaddress="http://......
  • RabbitMQ下载与安装
    1.首先进入rabbitmq官网找,查看rabbitmq对应的erlang之间对应的版本信息网址:RabbitMQErlangVersionRequirements—RabbitMQ网站看不懂的话可以使用windows系统最新的edge浏览器,有翻译功能.2.在github网站下载erlang的.npm文件(文件下载可能较慢,耐心等待)网址:http......