【算法5.1】背包问题 - 01背包 (至多最大价值、至少最小价值)

news2024/11/20 8:33:00

目录

至少模板和至多模板的两大区别

1、至多模板

2、至少模板

2. 01背包 - 至多模板 - 体积至多j,总价值最大

1、朴素做法 - 二维dp 

2、优化 - 一维dp

4700. 何以包邮? - 至少模板 - 价值至少j,总价值最小


 

至少模板和至多模板的两大区别

  • 初始化不同
  • 至多模板求的是最大值,所以初始化为f[0~m]=0
  • 至少模板求的是最小值,所以初始化为f[0]=0  f[1~m]=0x3f3f3f3f
  • j 循环范围不同:
  • 至多模板 for(int j=m;j>=w[i];j--) f[j] = max(f[j] , f[ j-w[i] ] + w[i])
  • 至少模板 for(int j=m;j>=0;j--) f[j] = min(f[j] , f[ max(j-w[i] , 0) ] + w[i])

1、至多模板

class Main
{
    static int N=1010;
    static int[] v=new int[N],w=new int[N];
    static int[] f=new int[N];
    
    //f[j] 总体积至多j的情况下,最大价值
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        for(int i=1;i<=n;i++) {v[i]=sc.nextInt();w[i]=sc.nextInt();}
        
        f[0]=0; //初始化 不选物品 总价值为0

        for(int i=1;i<=n;i++)
            for(int j=m;j>=v[i];j--)
                f[j]=Math.max(f[j],f[j-v[i]]+w[i]);

        System.out.print(f[m]);
    }
}

2、至少模板

class Main
{
    static int N=35,M=30*10000+10;
    static int[] w=new int[N];
    static int[] f=new int[M];
    static int n,x;
    
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();x=sc.nextInt();
        for(int i=1;i<=n;i++)  w[i]=sc.nextInt(); 
        
        Arrays.fill(f,0x3f3f3f3f);
        f[0]=0;
        for(int i=1;i<=n;i++)
            for(int j=x;j>=0;j--)
                f[j]=Math.min(f[j],f[Math.max(j-w[i],0)]+w[i]);
        
        System.out.print(f[x]);
    }
}

 

2. 01背包 - 至多模板 - 体积至多j,总价值最大

2. 01背包问题 - AcWing题库

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大
输出最大价值。

1、朴素做法 - 二维dp 

  • 状态定义:f[i][j] 表示只选前i件物品,总体积不超过j 的情况下的最大价值
  • 则答案就是f[n][m]

(当前的状态依赖于之前的状态,可以理解为从初始状态f[0][0] = 0开始决策,有 N 件物品,则需要 N 次决 策,每一次对第 i 件物品的决策,状态f[i][j]不断由之前的状态更新而来)

  • j < v[i],当前背包容量不够,不能选第i件物品,因此前i个物品最优解即为前 i−1个物品最优解

                f[i][j]=f[i-1][j]

  • j ≥ v[i],背包容量够,因此需要决策选与不选第i个物品
  1. 选  f[i][j]=f[i-1][j-v[i]]+w[i] (前i-1个物品且体积给第i件物体留个空+第i件物品的价值
  2. 不选 f[i][j]=f[i-1][j]
  3. 最后要求最大价值,则max(选,不选)
import java.util.*;

class Main
{
    static int N=1010;
    static int[] v=new int[N],w=new int[N];
    static int[][] f=new int[N][N];
    
    //f[i][j] 只选前i件物品,总体积不超过j的情况下,最大价值
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        for(int i=1;i<=n;i++)
        {
            v[i]=sc.nextInt();
            w[i]=sc.nextInt();
        }
        
        f[0][0]=0; //初始化 不选物品 总价值为0
        for(int i=1;i<=n;i++)
            for(int j=0;j<=m;j++)
            {
                f[i][j]=f[i-1][j]; //不选的情况
                if(j>=v[i]) //可以装得下的情况,max(不选,选)
                    f[i][j]=Math.max(f[i][j],f[i-1][j-v[i]]+w[i]);
            }
        System.out.print(f[n][m]);
    }
}

2、优化 - 一维dp

可以看出f[i][~]只依赖于f[i-1][~],所以根本没必要保留之前的f[i-2][~]等状态值

  • 状态定义:f[j] N 件物品,背包容量j情况下的最大价值

一维情况下枚举背包容量 j 需要逆序  大的先更新,小的再更新

import java.util.*;

class Main
{
    static int N=1010;
    static int[] v=new int[N],w=new int[N];
    static int[] f=new int[N];
    
    //f[j] 总体积恰好为j的情况下,最大价值
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt(),m=sc.nextInt();
        for(int i=1;i<=n;i++)
        {
            v[i]=sc.nextInt();
            w[i]=sc.nextInt();
        }
        
        f[0]=0; //初始化 不选物品 总价值为0
        for(int i=1;i<=n;i++)
            for(int j=m;j>=v[i];j--)
                f[j]=Math.max(f[j],f[j-v[i]]+w[i]);
        System.out.print(f[m]);
    }
}

4700. 何以包邮? - 至少模板 - 价值至少j,总价值最小

4700. 何以包邮? - AcWing题库

潜水员这题也是至少模板 AcWing 1020. 潜水员 - AcWing

【Acwing寒假2023每日一题】4700. 何以包邮?- 01背包dp至少模板_Roye_ack的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

list容器与vector容器的区别

vector与list都是STL中非常重要的序列式容器&#xff0c;它们都存放在namespace std命名空间中&#xff0c;由于俩个容器的底层结构不同&#xff0c;导致其特性不同 一、底层实现结构不同 vector本质是一段动态连续的顺序表&#xff0c;而list底层是一个双向循环链表 二、访…

Ubuntu多硬盘luks全盘加密自动解锁(硬件变更后失效)的方法

简介大家都知道&#xff0c;Linux现在用Luks全盘加密一直有一个痛点&#xff0c;就是每次开机都需要输入解密硬盘的密码&#xff0c;之后又要输入用户密码&#xff0c;非常的麻烦&#xff01;本文正是为了解决这个问题诞生的&#xff01;本文多硬盘加密带来的效果是&#xff0c…

Redis持久化——RDB机制详解

在运行情况下&#xff0c;Redis 以数据结构的形式将数据维持在内存中&#xff0c;为了让这些数据在 Redis 重启之后仍然可用&#xff0c;需要将数据写入持久存储 持久化是指将数据写入持久存储&#xff0c;例如固态磁盘(SSD) Redis 提供了一系列持久化选项。这些包括&#xff1…

Java-黑马Java学习作业-day07综合练习

学习视频链接&#xff1a;黑马Java学习视频 文章目录练习一&#xff1a;飞机票练习二&#xff1a;打印素数练习三&#xff1a;验证码练习四&#xff1a;复制数组练习五&#xff1a;评委打分练习六&#xff1a;数字加密练习七&#xff1a;数字解密练习八&#xff1a;抽奖解法一:…

【C++11】—— 可变参数模板

目录 一、可变参数模板概念以及定义方式 二、参数包的展开 1. 递归函数方式展开参数包 2. 逗号表达式展开参数包 三、STL容器中的empalce相关接口函数 一、可变参数模板概念以及定义方式 在c11之前&#xff0c;类模板和函数模板只能含有固定数量的模板参数&#xff0c;c11…

JavaScript高级 ES5 面向对象原型继承

原型以及ES5中实现继承1. 对象和函数的原型1. 普通对象的原型 [[prototype]]2. 函数的原型 prototype2. new、constructor1. new 操作符2. constructor属性3. 将方法放到原型上4. 创建对象的内存表现5. 重写原型对象3. 原型链的查找顺序4. 原型链实现的继承5. 借用构造函数继承…

深入URP之Shader篇10: 深度值专题(1)

之前研究Unlit shader的时候就遇到一些Z值相关的问题&#xff0c;一笔带过了&#xff0c;比如ComputeFogFactor中的UNITY_Z_0_FAR_FROM_CLIPSPACE。今天就把URP Shader中出现的Z相关的问题做一个专题一起研究下。 深度缓冲的方向和UNITY_REVERSED_Z 先说这个关于z的宏&#x…

nacos:服务注册与发现

导入SpringCloudAlibaba相关的依赖&#xff0c;并在父工程将依赖进行管理 <dependencyManagement> <dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-s…

Java EE|多线程代码实例之定时器与线程池

文章目录&#x1f534;定时器什么是定时器以及开发中的作用标准库中的定时器定时器的实现&#x1f534;线程池什么是线程池标准库中的线程池创建一个线程池ThreadPoolExecutor构造方法解析线程池的实现&#x1f534;定时器 什么是定时器以及开发中的作用 程序中的定时器功能与…

【互联网大厂机试真题 - 华为】九宫格

题目描述 九宫格是一款广为流传的游戏,起源于河图洛书。游戏规则是:1到9九个数字放在3x3的格子中,要求每行、每列以及两个对角线上的三数之和都等于15. 在金麻名著《射雕英雄传》中黃蓉曾给九宫格的一种解法,口诀:戴九恩一,左三右七,二四有肩,八六为足,五居中央。解法…

【云原生进阶之容器】第四章Operator原理4.3节--Operator模式

1 Operator概述 1.1 诞生背景 Kubernetes实际是期望状态管理器。先在Kubernetes中指定应用程序期望状态(实例数,磁盘空间,镜像等),然后它会尝试把应用维持在这种状态。Kubernetes的控制平面运行在Master节点上,它包含数个controller以调和应用达到期望状态: 检查当前的…

【阶段三】Python机器学习30篇:机器学习项目实战:智能推荐系统的基本原理与计算相似度的常用方法

本篇的思维导图: 智能推荐系统模型 智能推荐系统属于非监督式学习,是机器学习一个非常重要的应用领域,它能带来的经济价值往往是直接且非常可观的。 智能推荐系统的基本原理 智能推荐系统的应用场景 互联网每天都在产生海量信息,用户行为数据呈现爆发式增长…

PyTorch - 常见神经网络

文章目录LeNetAlexNetDropoutAlexNet 网络结构torchvision中的AlexNet的实现ZFNetVGG-NetsVGG 各网络VGG-16 网络结构GoogLeNet代码实现ResNetDenseNetRNNLSTMGRULeNet 1998年&#xff0c;由 LeCun 提出用于手写数字识别任务只有5层结构&#xff1b;目前看来不输入深度学习网络…

智能售货机系统帝可得

智能售货机 概述项目使用springcloudalibaba中提供的短信服务图形验证码生成多端登录/网关统一鉴权对象存储服务代码的自动填充微服务集成emq&#xff0c;发送emq工单业务流 接收工单 拒绝工单 运维工单补货工单使用xxl-job进行任务调度lkd集成xxl-job自动创建维修工单自动…

设计模式_结构型模式 -《代理模式》

设计模式_结构型模式 -《代理模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承…

Docker 架构和安装

Docker 包括三个基本概念: 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。 容器&#xff08;Con…

<Linux> Linux项目自动化构建工具—makemakefile的使用

< Linux> Linux 项目自动化构建工具—make/makefile的使用 文章目录< Linux> Linux 项目自动化构建工具—make/makefile的使用一、make/makefile的背景二、如何编写 makefile1.依赖关系和依赖方法2.makefile的使用3.clean的使用4.多文件编译5.伪目标 .PHONY6.三个时…

无约束优化——线性搜索法

无约束优化——线性搜索法&#xff08;line search&#xff09;前言概述构建关于步长的函数Wolfe条件Strong Wolfe条件Zoutendijk条件后记前言 该系列为学习笔记系列&#xff0c;所有内容可以在 Numerical Optimization (2nd Edition) 中找到&#xff0c;该书十分有用经典建议…

组件封装 - Tabs组件

首先我们先来看一下 Element UI 里面的 Tabs 是怎么样的 <template><el-tabs v-model"activeName" class"demo-tabs" tab-click"handleClick"><el-tab-pane label"User" name"first">User</el-tab-pa…

基于matlab的汽车牌照识别程序详细教程

设计一个基于matlab的汽车牌照识别程序&#xff0c;能够实现车牌图像预处理&#xff0c;车牌定位&#xff0c;字符分割&#xff0c;然后通过神经网络对车牌进行字符识别&#xff0c;最终从一幅图像中提取车牌中的字母和数字&#xff0c;给出文本形式的车牌号码。关键词&#xf…