完全背包--动态规划

news2024/9/26 5:20:40

一)模板题:完全背包

【模板】完全背包_牛客题霸_牛客网 (nowcoder.com)

第一问:

一)定义一个状态表示: 

dp[i][j]表示从前i个物品中选,总体积不超过j,所有选法中,最大的价值

二)根据状态标识推到状态转移方程:根据最后一个位置的状态来划分问题

之前做01背包问题的时候我们i位置的值是可以选也是可以不选的,但是在多重背包里面,最有一个位置的值可以不选,可以选择1个,可以选择2个,还可以选择多个,所以说此时可以进行讨论的情况就变得非常多,只要背包能放得下,那么我就可以无限选

1)如果我进行挑选i位置的礼物1个,那么我们只需要去0到i-1区间内去寻找j-v[i]的最大价值即可,if(j-v[i]>=0) dp[i][j]=dp[i-1][j-v[i]]+w[i](你所进行挑选的礼物不能超过j)

2)如果我们挑选i位置的礼物2个,那么我们只需要去找0-i-1区间去寻找j-2v[i]的礼物的最大价值即可,if(j-2*v[i]>=0) dp[i][j]=dp[i-1][j-2v[i]]+2*w[i];

3)如果挑选i位置的礼物3个,dp[i][j]=dp[i-1][j-3v[i]+2*w[i];

所以最终的状态转移方程就是dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-k*v[i]]+k*w[i])

上面的状态转移方程的终极状态就是j-kv[i]和j-xv[i]要无限接近等于0,所以k=x

 

三)初始化:

我们这个题是新增加了一行,新增加了一列

dp[0][0]=0

dp[0][i]=0(什么都不选,体积为0,价值为0)

dp[i][0]=0

其实这个初始化的时候是不需要考虑第一列的时候,j此时等于0,那么j-v[i]>=0,那么v[i]也只能等于0,那么此时dp[i][j-v[i]]=dp[i][0]+w[i],此时只会使用到上一行的值,此时和j一点关系都没有,所以第一行不用初始化

四)填表顺序:

这个题就和01背包问题的填表顺序不一样了,01背包问题是使用的是全部是上一行的状态,而完全背包问题使用的是上一行的状态和右边的状态,所以最终的填表顺序就是从上向下每一行只能从左向右,所以返回值就是dp[n][V]

第二问:

这一问和上一问不同的是总体积一定要装满,也就是说最终的总体机之和一定要等于V

一)定义一个状态标识:

dp[i][j]表示从前i个物品中进行选择,总体积恰好等于j,所有选择方法中,礼物的最大价值

二)根据状态表示推到状态转移方程

1)如果不选择i位置的商品,那么我就去前i-1中选择物品的体积等于j的所有的商品组合中的最大值,dp[i][j]=dp[i-1][j],但是有可能会出现无法在前i-1个商品中选择的商品组合中恰好商品的总体积之和等于j的情况,所以我们约定dp[i][j]=-1表示无法在前i-1个商品中选择的商品组合中恰好等于j的情况

2)如果选择i位置的商品,当前商品我可以选择1个,也可以选择2个,只要当前背包装得下,况且说背的总体积等于j即可

dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-v[i]]+w[i])

j-v[i]>=0&&dp[i-1][j-v[i]]!=-1(无法在i-1个商品中选择商品体积要等于j-v[i]的值的组合

三)初始化

dp[0][0]=0

dp[0][i]=-1(无法在前0个商品中选择礼物的总体积是i的情况)

dp[i][0]=0

四)填表顺序+返回值:从上到下,每一行必须从左向右

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
       Scanner scanner=new Scanner(System.in);
       int n=scanner.nextInt();
       int V=scanner.nextInt();
       int[] v=new int[n+1];
       int[] w=new int[n+1];
       int[][] dp1=new int[n+1][V+1];
       for(int i=1;i<=n;i++){
         v[i]=scanner.nextInt();
         w[i]=scanner.nextInt();
       }
    for(int i=1;i<=n;i++){
    for(int j=1;j<=V;j++){
            dp1[i][j]=dp1[i-1][j];
if(j-v[i]>=0) dp1[i][j]=Math.max(dp1[i][j],dp1[i][j-v[i]]+w[i]);
         }
       }
    System.out.println(dp1[n][V]);
    int[][] dp2=new int[n+1][V+1];
    dp2[0][0]=0;
    for(int i=1;i<=V;i++){
        dp2[0][i]=-1;
      }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=V;j++){
    if(j-v[i]>=0&&dp2[i][j-v[i]]!=-1) 
            dp2[i][j]=dp2[i][j-v[i]]+w[i];
    else dp2[i][j]=-1;//如果无法选择出那么dp[i][j]=-1
    dp2[i][j]=Math.max(dp2[i][j],dp2[i-1][j]);
        }
      }
       System.out.println(dp2[n][V]==-1?0:dp2[n][V]);
    }
}

利用滚动数组来做空间上的优化:

所以说现在能不能使用一行来完成滚动数组的优化?

当然可以但是填表顺序一定要从左向右进行填表

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
       Scanner scanner=new Scanner(System.in);
       int n=scanner.nextInt();
       int V=scanner.nextInt();
       int[] v=new int[n+1];
       int[] w=new int[n+1];
       int[] dp1=new int[V+1];
       for(int i=1;i<=n;i++){
         v[i]=scanner.nextInt();
         w[i]=scanner.nextInt();
       }
    for(int i=1;i<=n;i++){
    for(int j=1;j<=V;j++){
if(j-v[i]>=0) dp1[j]=Math.max(dp1[j],dp1[j-v[i]]+w[i]);
         }
       }
    System.out.println(dp1[V]);
    int[] dp2=new int[V+1];
    dp2[0]=0;
    for(int i=1;i<=V;i++){
        dp2[i]=-1;
      }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=V;j++){
    int temp=dp2[j];
    if(j-v[i]>=0&&dp2[j-v[i]]!=-1) 
            dp2[j]=dp2[j-v[i]]+w[i];
    else dp2[j]=-1;//如果无法选择出那么dp[i][j]=-1
    dp2[j]=Math.max(temp,dp2[j]);
        }
      }
       System.out.println(dp2[V]==-1?0:dp2[V]);
    }
}

二)零钱兑换

322. 零钱兑换 - 力扣(LeetCode)

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

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

相关文章

配置tomcat内存大小(windows、linux)

一、参数说明 -Xms&#xff1a; JVM初始分配的堆内存 -Xmx&#xff1a; JVM最大允许分配的堆内存&#xff0c;按需分配 -XX:PermSize&#xff1a; JVM初始分配的非堆内存 -XX:MaxPermSize&#xff1a; JVM最…

华为openGauss数据库入门 - gsql用法

目录 1.1 gsql的语法 1.2 gsql常用选项 1.2.1 最常用的必要选项 1.2.2 -r选项 1.2.3 -E选项 1.2.4 -t选项 1.2.5 -A选项 1.2.6 -v选项 1.2.7 -c选项 1.2.8 -f选项 1.2.9 -q选项 1.3 gsql的元命令 1.3.1 \l命令 1.3.2 \du命令和\dg命令 1.3.3 \db命令 1.3.4 \d…

flask部署钉钉机器人和企业微信机器人

引言 创建机器人&#xff0c;目的是通过机器人的方式&#xff0c;提出用户的问题&#xff0c;得到想要的回答 钉钉机器人 首先我们需要获取钉钉的企业内部开发者权限然后我们进入钉钉开放平台,登陆后&#xff0c;选择应用开发->机器人->创建应用&#xff0c;我创建了一…

用HTML写一个简单的静态购物网站

实现代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>购物网站</title> &l…

如何判断直线导轨的质量?

直线导轨是机械行业中的重要传动零部件&#xff0c;随着科技3.0时代的到来&#xff0c;直线导轨的需求量也在不断的增加&#xff0c;目前市面上直线导轨的品牌有很多&#xff0c;质量也是良莠不济&#xff0c;那么&#xff0c;我们应该怎样才能挑选到质量好的直线导轨呢&#x…

Python - OpenCV实现摄像头人脸识别(亲测版)

要使用Python 3和OpenCV进行摄像头人脸识别&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1.安装OpenCV库 在命令行中输入以下命令&#xff1a; pip install opencv-python2.准备人脸检测器 使用OpenCV的人脸检测器可以检测出图像中的人脸。在Python中&#xff0c;您…

十一章:Weakly-Supervised Semantic Segmentation Network —— 基于深度种子区域增长的弱监督语义分割网络

0.摘要 本文研究了只使用图像级别标签作为监督来学习图像语义分割网络的问题&#xff0c;这是重要的&#xff0c;因为它可以显著减少人工标注的工作量。最近在这个问题上的最新方法首先使用深度分类网络推断出每个对象类的稀疏和有区别的区域&#xff0c;然后使用有区别的区域作…

const int * p,int const *p, int * const p, const int *const p 搞不清楚?

一、废话不多说&#xff0c;直接来结论 变量含义const int *p 指针p可以修改&#xff0c;*p不可修改int const *p 指针p可以修改&#xff0c;*p不可修改int *const p指针p不可以修改&#xff0c;*p可以修改const int * const p指针p不可以修改&#xff0c;*p不可以修改 显…

黑客学习手册(自学网络安全)

一、首先&#xff0c;什么是黑客&#xff1f; 黑客泛指IT技术主攻渗透窃取攻击技术的电脑高手&#xff0c;现阶段黑客所需要掌握的远远不止这些。 二、为什么要学习黑客技术&#xff1f; 其实&#xff0c;网络信息空间安全已经成为海陆空之外的第四大战场&#xff0c;除了国…

MES中的EAP有什么作用?

在现代制造业中&#xff0c;MES&#xff08;Manufacturing Execution System&#xff09;是一个关键的生产管理系统&#xff0c;用于监控、控制和优化制造过程。而EAP&#xff08;Equipment Automation Program&#xff09;作为MES的重要组成部分之一&#xff0c;在生产线上发挥…

DL优化器精简总结 | SGD, Momentum, AdaGrad, Rmsprop, Adam, AdamW

&#x1f525; DL里的优化器相关考点&#xff0c;面试时面试官偶尔会问甚至变态点的会叫代码手撕&#xff0c;笔试选择题只要跟DL相关基本必考。废话不多说&#xff0c;直接上&#xff01; &#x1f604; 当然并不是纯为了面试&#xff0c;只不过说你如果是搞DL的连优化器都说…

性能测试QPS+TPS+事务基础知识分析

本篇文章是性能测试基础篇&#xff0c;主要介绍了性能测试中对QPSTPS事务的基础知识分析&#xff0c;有需要的朋友可以借鉴参考下&#xff0c;希望可以对广大读者有所帮助 事务 就是用户某一步或几步操作的集合。不过&#xff0c;我们要保证它有一个完整意义。比如用户对某一个…

#P1009. [NOIP2016提高组] 玩具小人

题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业。 有一天, 这些玩具小人把小南的眼镜藏了起来。 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图: 这时 singer 告诉小南一个谜題: “眼镜藏在我左数第 33 个玩具小人的右数第 11 个玩具小人的…

CMU 15-445 -- Database Recovery - 18

CMU 15-445 -- Database Recovery - 18 引言ARIESLog Sequence NumbersNormal ExecutionTransaction CommitTransaction AbortCompensation Log Records Non-fuzzy & fuzzy CheckpointsSlightly Better CheckpointsFuzzy Checkpoints ARIES - Recovery PhasesAnalysis Phas…

第四范式x百胜软件 以生成式AI改造零售软件

7月20日&#xff0c;在百胜软件联合探路者举办的行业数字化转型研学活动上&#xff0c;百胜软件联合第四范式宣布将以「式说」大模型为核心&#xff0c;在软件智能化升级、行业赋能等方面开展深入合作&#xff0c;共同推动大模型在零售行业的创新与应用。 活动上&#xff0c;双…

RK3588 使用OpenCL 遇到坑

资源1:本文章的源代码为:加速中... 资源2:RK3588 Android上应用使用OpenCL,所需的所有so 一:RK3588是否支持OpenCL 通过GPT一通搜索,说不支持。 感觉GPT东西不全可信啊!!! 导致自己一直怀疑RK3588不支持OpenCL使用,为什么呢? 1.通过adb shell 发现里面没有clinfo…

游戏图标有哪些素材模板推荐

游戏图标设计在游戏UI中占有非常重要的地位。例如&#xff0c;当我们看到一个游戏的启动图标时&#xff0c;很容易区分它是哪个游戏。设计游戏图标不仅是一个图形&#xff0c;也是一个标志。 本文将通过各种游戏图标设计素材分享游戏图标的类别和设计游戏图标的思考。 1. 游戏…

滴水逆向三期笔记与作业——02C语言——05 正向基础/05 循环语句

目录 一、缓冲区溢出的HelloWorld二、永不停止的HelloWorld三、基础知识3.1 变量的声明3.2 类型转换&#xff08;一般用于小转大&#xff09;3.3 表达式3.4 语句和程序块3.5 参数与返回值3.6 关系运算符3.7 逻辑运算符&#xff1a;&& || !3.8 单目运算符3.9 三目运算符…

人工智能TensorFlow MNIST手写数字识别——实战篇

上期文章TensorFlow手写数字-训练篇,我们训练了我们的神经网络,本期使用上次训练的模型,来识别手写数字(本期构建TensorFlow神经网络代码为上期文章分享代码) http://scs.ryerson.ca/~aharley/vis/conv/ 0、插入第三方库 from PIL import Image# 处理图片 import tensorf…

Python补充笔记5-模块化、文件

目录 一、模块 二、模块的导入 三、python中的包​编辑 四、常用的内容模块 五、第三方模块的安装与使用 六、编码格式的介绍 七、文件读写的原理 八、常用的文件打开模式 ​九、文件对象的常用方法 十、with语句​编辑 十一、os模块的常用函数 十二、os.path模块的常用方法​编…