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

动态规划:砝码称重(01背包-闫氏DP分析法)

动态规划:砝码称重(01背包-闫氏DP分析法)

砝码称重

www.acwing.com/problem/content/3420/

在这里插入图片描述

DP:

  • 状态表示:f[i][j]

    • 集合:只用前 i i i 个砝码,测出重量为 j j j 的所有方案
    • 属性:bool
  • 状态计算: f [ i ] [ j ] = f [ i − 1 ] [ j ] ∣ ∣ f [ i − 1 ] [ j − w [ i ] ] f[i][j]=f[i-1][j]\ \ ||\ \ f[i-1][j-w[i]] f[i][j]=f[i1][j]  ∣∣  f[i1][jw[i]]

对于本题,由于砝码可以放在天平两侧,可以将一个砝码拆为一正一负,用来表示放在天平的哪一侧,最后统计大于 0 的部分即可

实现方式有两种:

  1. 分开 DP,需要改变遍历顺序(仅一维的情况,二维不需要考虑),因为当 w[i]​ 为负数时,要获取上一层的数据应该从小到大(和 w[i]​ 为正数时相反)
  2. 构造一个大数组,设定一个基准 B B B 作为零度线,这样就将负数和正数的组成方案全部放在同一个数组中,最后只要统计大于 B B B 的结果即可
import java.util.*;public class Main {static final int N = 200010;static int[] w = new int[N];static boolean[] f = new boolean[N];public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int sum = 0;for (int i = 1; i <= n; i++) {w[i] = sc.nextInt();w[i + n] = -w[i];sum += w[i];}// dp砝码全放一侧f[0] = true;for (int i = 1; i <= n; i++) {for (int j = sum; j >= 0; j--) {if (j - w[i] >= 0) {f[j] = f[j] || f[j - w[i]];}}}// dp砝码放两侧,遍历顺序不同for (int i = n + 1; i <= 2 * n; i++) {for (int j = 0; j <= sum; j++) {// 此时w[i]均为负数f[j] = f[j] || f[j - w[i]];}}int count = 0;for (int i = 1; i <= sum; i++) {if (f[i]) {count++;}}System.out.println(count);}
}
http://www.lqws.cn/news/440875.html

相关文章:

  • 性能优化中的工程化实践:从 Vite 到 Webpack 的最佳配置方案
  • Day05_数据结构总结Z(手写)
  • 386. 字典序排数
  • 解码成都芯谷金融中心:文化科技产业园的产融创新生态密码
  • 2025年八大科技趋势
  • Spring Boot + MyBatis + Vue:构建高效全栈应用的实战指南
  • bos_token; eos_token; pad_token是什么
  • 农村土地经营权二轮延包—一键生成属性数据库MDB
  • 解决docker pull镜像慢的问题
  • 【设计模式】用观察者模式对比事件订阅(相机举例)
  • 【分布式】基于Redisson实现对分布式锁的注解式封装
  • 【JavaEE】(3) 多线程2
  • API网关Apisix介绍
  • MySQL高可用方案解析与选型指南
  • Android图形系统框架解析
  • 【MySQL基础】MySQL内置函数全面解析:提升你的数据库操作效率
  • AI与大数据如何驱动工业品电商平台的智能决策?
  • mongodb单节点改副本集模式
  • Spring Boot + MyBatis + Vue:打造高效全栈应用的黄金组合
  • CppCon 2017 学习:Esoteric Data Structures and Where to Find Them
  • 《汇编语言:基于X86处理器》第2章 复习题
  • infinisynapse 使用清华源有问题的暂时解决方法:换回阿里云源并安装配置PPA
  • flink的多种部署模式
  • YOLOv8改进:Neck篇——2024.1全新MFDS-DETR的HS-FPN特征融合层解析
  • 使用 rsync 拉取文件(从远程服务器同步到本地)
  • Mac 安装ElasticSearch和Kibana详细教程
  • 【面试题002】synchronized和lock的区别
  • C#最佳实践:为何优先使用查询语法而非循环
  • Kafka使用Elasticsearch Service Sink Connector直接传输topic数据到Elasticsearch
  • 清除 docker 无用的 镜像/容器