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

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

本题做法

  • 0-1 背包 DP。

思路

这道题是一道变形的 0-1 背包 DP 好题。

题目中说,砝码可以放在左边,也可以放在右边。我们令左盘的砝码重量始终大于或等于右盘的重量,设左盘的重量为 \(m_l\),右盘的重量为 \(m_r\),物品的重量为 \(m_t\)。则有:

\[m_l=m_r+m_t \]

此时,若我们又要重新放一个重量为 \(m_p\) 的砝码,若放在左盘中,物品的重量就要增加 \(m_p\);若要把砝码放在右盘中,则物品的重量就要减少 \(m_p\)

此时我们定义状态 \(dp[i][j]\) 表示在使用前 \(i\) 个砝码的情况下可否乘出重量 \(j\)(是的话为 true,否的话为 false)。通过上面的分析可知,\(dp[i][j]\) 可以由:

\[dp[i-1][j]或dp[i-1][j+w[i]]或dp[i-1][\ |j-w[i|\ ] \]

转移而来,因为只需要满足上面的 3 项有一项为 true 即可,所以状态转移方程为(其中 \(∨\) 表示逻辑或):

\[dp[i][j]=dp[i-1][j]∨dp[i-1][j+w[i]]∨dp[i-1][\ |j-w[i]|\ ] \]

当然,对于特殊情况 \(j=w[i]\) 时,我们可以直接得到:

\[dp[i][j]=\text{true} \]

代码

#include<bits/stdc++.h>typedef long long ll;
typedef unsigned long long ull;using namespace std;const int N=105;
const int T=1e5+5;int n,w[N],dp[N][T];int main(){cin>>n;for(int i=1;i<=n;i++) cin>>w[i];dp[0][0]=1;for(int i=1;i<=n;i++) {for(int j=1;j<T;j++) {if(j==w[i]) dp[i][j]=1;else{dp[i][j]|=dp[i-1][j];dp[i][j]|=dp[i-1][abs(j-w[i])];if(j+w[i]<T) dp[i][j]|=dp[i-1][j+w[i]];}}} int ans=0;for(int i=1;i<T;i++){if(dp[n][i]) ans++;}cout<<ans<<endl;return 0;
}
http://www.sczhlp.com/news/1177/

相关文章:

  • 拼接文件路径
  • 踩坑:Mybatis Plus 逻辑删除 @TableLogic
  • UE简单激活教程V24.00.0.72
  • msf生成Windows木马
  • 深入浅出控制反转与依赖注入:从理论到实践 - 详解
  • java入门:安装开发环境
  • 背包DP(基础篇) - L
  • 3、行列转换(列转行)
  • 洛谷P1510 精卫填海 题解
  • 30
  • 25.7.29ds专题测试总结
  • 软工7.29
  • 在线卷积全解-从cdq分治到多叉与自迭代结构
  • ​iTrustSSL证书夏季大促,最高直降92.5%!
  • Ekoparty CTF 2024 赛题详解:从取证分析到密码破解的实战记录
  • 亚马逊机器人如何用多模态识别技术取代条形码
  • js获取多个div元素的方法。如果这些div有父子关系,如何进行区分?如何由子获得父?
  • django+Vue的项目使用docker打包
  • PyTorch 构建轻量级验证码识别模型
  • Hello CnBlogs
  • 从简历到入职:Moka稳定性雷达如何预测候选人留存率
  • [POI2012] Prefixuffix 题解
  • 2025 -- 云智计划 -- 【CSP-S】模拟赛 #2_总结+题解
  • 20
  • 使Excel高亮显示选中表格(使选中的表格更加突出)
  • 2、统计连续登录5天的用户
  • AMD纯NPU运行AI画图StableDiffusion3.0模型
  • C#自学笔记:委托与事件
  • 电流探头去磁与调零操作对测量精度的影响
  • 企业HR如何将AI Agent作为战略引擎重构业务流程