Leetcoder Day39| 动态规划part06 完全背包问题

完全背包理论

有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。

示例:

背包最大重量为4。

物品为:

重量价值
物品0115
物品1320
物品2430

每件商品都有无限个!

问背包能背的物品最大价值是多少?

完全背包和01背包问题唯一不同的地方就是,每种物品有无限件

同样leetcode上没有纯完全背包问题,都是需要完全背包的各种应用,需要转化成完全背包问题,所以这里还是以纯完全背包问题进行讲解理论和原理。

01背包和完全背包唯一不同就是体现在遍历顺序上,因此直接针对遍历顺序经行分析!01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次,而完全背包的物品是可以多次添加的,所以这里就要从小到达遍历。

其次是先后问题,为什么遍历物品在外层循环,遍历背包容量在内层循环?

在01背包中,如果是定义了二维数组,则先遍历谁都可以,而定义一维数组后,两个for循环先后循序一定是先遍历物品,再遍历背包容量。

在完全背包中,对于一维dp数组来说,其实两个for循环嵌套顺序是无所谓的!因为dp[j] 是根据 下标j之前所对应的dp[j]计算出来的。 只要保证下标j之前的dp[j]都是经过计算的就可以了。

遍历物品在外层循环,遍历背包容量在内层循环,状态如图:

遍历背包容量在外层循环,遍历物品在内层循环,状态如图:

因此,完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])

518.零钱兑换II

给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。

示例 1:

  • 输入: amount = 5, coins = [1, 2, 5]
  • 输出: 4

解释: 有四种方式可以凑成总金额:

  • 5=5
  • 5=2+2+1
  • 5=2+1+1+1
  • 5=1+1+1+1+1

示例 2:

  • 输入: amount = 3, coins = [2]
  • 输出: 0
  • 解释: 只用面额2的硬币不能凑成总金额3。

示例 3:

  • 输入: amount = 10, coins = [10]
  • 输出: 1

注意,你可以假设:

  • 0 <= amount (总金额) <= 5000
  • 1 <= coin (硬币面额) <= 5000
  • 硬币种类不超过 500 种
  • 结果符合 32 位符号整数

本题可以重复放入金币,也就是物品,因此属于完全背包问题。转换为背包问题就是:

  1. 确定dp数组以及下标的含义:dp[j]为凑成总金额j的货币组合数
  2. 确定递推公式:dp[j] 就是所有的dp[j - coins[i]]想加的情况。dp[j]+=dp[j-coins[i]]
  3. dp数组如何初始化:当金币总额为0的时候,就只有一种情况,不放入金币,所以dp[0]=1
  4. 确定遍历顺序:在完全背包中,先遍历背包或者物品都是可以的。因为纯完全背包求得装满背包的最大价值是多少,和凑成总和的元素有没有顺序没关系,以纯完全背包是能凑成总和就行,不用管怎么凑的。但本题要求凑成总和的组合数,元素之间明确要求没有顺序那么如果外层for循环遍历物品(钱币),内层for遍历背包(金钱总额)的情况,假设:coins[0] = 1,coins[1] = 5。就是先把1加入计算,然后再把5加入计算,得到的方法数量只有{1, 5}这种情况。而不会出现{5, 1}的情况所以这种遍历顺序中dp[j]里计算的是组合数!如果把两个for交换顺序,那么背包容量的每一个值,都是经过 1 和 5 的计算,包含了{1, 5} 和 {5, 1}两种情况,此时计算的是排列数,本题要求不重复,只计算组合数即可,所以需要先遍历物品,再遍历背包。
class Solution {
    /**
    dp[j]为凑成总金额j的货币组合数
    dp[0]=1
    dp[j]+=dp[j-coins[i]]
     */
    public int change(int amount, int[] coins) {
        int[] dp= new int[amount+1];
        dp[0]=1;
        for(int i=0;i<coins.length;i++){
            for(int j=coins[i];j<=amount;j++){
                dp[j]+=dp[j-coins[i]];
            }
        }
        return dp[amount];
    }
}

377. 组合总和 Ⅳ

给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。

示例:

  • nums = [1, 2, 3]
  • target = 4

所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)

请注意,顺序不同的序列被视作不同的组合。

因此输出为 7

本题可以重复放物品,所以为完全背包问题,思考下面五部曲:

  1. 确定dp数组以及下标的含义:dp[j]为凑成目标j的元素组合数
  2. 确定递推公式:dp[j]+=dp[j-nums[i]]
  3. dp数组如何初始化:dp[0]=1
  4. 确定遍历顺序:题里给的示例很明确的说民反,顺序不同的序列视作不同的组合,也就是{1,2}和{2,1}算两种组合,因此这里需要计算的是排列数,因此需要先遍历背包,再遍历物品。

本题再次强调的一点:

  • 如果求组合数就是外层for循环遍历物品,内层for遍历背包
  • 如果求排列数就是外层for遍历背包,内层for循环遍历物品
class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target+1];
        dp[0]=1;
        //求排列个数,需要先遍历背包再遍历物品
        for(int j=0;j<=target;j++){
            for(int i=0;i<nums.length;i++){
                if(j-nums[i]>=0 ) dp[j]+=dp[j-nums[i]];
            }
        }
        return dp[target];
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023第二届陇剑杯网络安全大赛 SS Writeup

sevrer save_1 打开流量包文件过滤http流量 从这个/helloworld/greeting开始追踪TCP流 直接百度搜索payload 搜索得到这题flag就是CVE-2022-22965 sevrer save_2 追踪TCP流&#xff0c;在tcp.stream eq 106&#xff0c;发现反弹shell的IP和端口 这题flag为192.168.43.128:2333…

PPT模板一键下载,原创精美,2024必备!

1. PPT模板分享 &#xff08;1&#xff09;计算机学院毕业答辩PPT &#xff08;2&#xff09;开学典礼活动策划方案PPT &#xff08;3&#xff09;新员工入职培训PPT &#xff08;4&#xff09;宠物行业分析报告PPT &#xff08;5&#xff09;机关青年干部述职PPT 以上PPT模板均…

centos离线安装 k8s (实操可用)

全部安装包rpm下载&#xff08;已整理好k8s和docker&#xff09;&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1ATv8BPijhvIKWz4hMnkx6Q?pwdt5db 提取码&#xff1a;t5db 将文件下载以后&#xff0c;解压到服务器 #执行所有docker-rpm包 yum -y localinstall *.rpm…

testvue-个人中心

header.vue(右上角) <template><div class="header"><!-- 折叠按钮 --><div class="collapse-btn" @click="collapseChage"><i v-if="!collapse" class="el-icon-s-fold"></i><…

实现大华摄像头的抓图-使用HTTP方式

实现抓图&#xff0c;网上大部分都是使用SDK二次开发的&#xff0c;HTTP接口实现的基本没有介绍&#xff0c;好像官方叫CUI接口&#xff0c;但是找官方要文档&#xff0c;基本要不到&#xff0c;我自己下载了一份以前的文档&#xff0c;可以做大部分操作&#xff0c;这里免费分…

【MySQL】用户管理 -- 详解

如果我们只能使用 root 用户&#xff0c;这样存在安全隐患。这时就需要使用 MySQL 的用户管理。 一、 用户 1、用户信息 MySQL 中的用户都存储在系统数据库 MySQL 的 user 表中。 字段解释&#xff1a; host&#xff1a;表示这个用户可以从哪个主机登陆&#xff0c;如果…

哪些公司在招聘GIS开发?为什么?

之前我们给大家整理汇总了WebGIS在招岗位的一些特点&#xff0c;包括行业、学历、工作经验等。WebGIS招聘原来看重这个&#xff01;整理了1300多份岗位得出来的干货&#xff01; 很多同学好奇&#xff0c;这些招GIS开发的都是哪些公司&#xff1f;主要是做什么的&#xff1f; …

gym平衡木训练Q-learning完整代码

安装 pip install gym编码运行 #codingutf8import gym import numpy as npenv gym.make(CartPole-v0)max_number_of_steps 200 # 每一场游戏的最高得分 #---------获胜的条件是最近100场平均得分高于195------------- goal_average_steps 195 num_consecutive_iteration…

Pytorch入门实战 P1-实现手写数字识别

目录 一、前期准备&#xff08;环境数据&#xff09; 1、首先查看我们电脑的配置&#xff1b; 2、使用datasets导入MNIST数据集 3、使用dataloader加载数据集 4、数据可视化 二、构建简单的CNN网络 三、训练模型 1、设置超参数 2、编写训练函数 3、编写测试函数 4、…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…

浅析extern关键字

C中extern关键字的使用 文章目录 C中extern关键字的使用前言正文1. C与C编译区别2. C调用C函数3. C中调用C函数 总结 前言 ​ C 是一种支持多范式的编程语言&#xff0c;它既可以实现面向对象的编程&#xff0c;也可以实现泛型编程和函数式编程。C 还具有与C语言的兼容性&…

大数据最佳实践

本文主要收录一些大数据不错的实践文章 1、数禾云上数据湖最佳实践 https://blog.51cto.com/u_15089766/2601706 该文章介绍了数禾云的数据胡实践&#xff0c;包含presto以及数据湖等组件的一些部署架构&#xff0c;文章听不错的&#xff0c;里面提到了为了避免presto与yarn计…

【Kaggle】练习赛《肥胖风险的多类别预测》

前言 作为机器学习的初学者&#xff0c;Kaggle提供了一个很好的练习和学习平台&#xff0c;其中有一个栏目《PLAYGROUND》&#xff0c;可以理解为游乐场系列赛&#xff0c;提供有趣、平易近人的数据集&#xff0c;以练习他们的机器学习技能&#xff0c;并每个月都会有一场比赛…

【开源】SpringBoot框架开发快乐贩卖馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 搞笑视频模块2.3 视频收藏模块2.4 视频评分模块2.5 视频交易模块2.6 视频好友模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 搞笑视频表3.2.2 视频收藏表3.2.3 视频评分表3.2.4 视频交易表 四、系…

【剑指offer--C/C++】JZ6 从尾到头打印链表

一、题目 二、本人思路及代码 直接在链表里进行翻转不太方便操作&#xff0c;但是数组就可以通过下标进行操作&#xff0c;于是&#xff0c; 思路1、 先遍历链表&#xff0c;以此存到vector中&#xff0c;然后再从后往前遍历这vector,存入到一个新的vector&#xff0c;就完成…

OPC UA 学习笔记:状态机/有限状态机

有限状态机 有限状态机 &#xff08;FSM&#xff09; 是程序员、数学家、工程师和其他专业人士用来描述具有有限数量条件状态的系统的数学模型。 有限状态机的构成包括以下内容&#xff1a; 一组潜在的输入事件。与潜在输入事件相对应的一组可能的输出事件。系统可以显示的一…

dubbo3适配springboot2.7.3

版本详细 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.0.3</version> </dependency><parent><groupId>org.springframework.boot</groupId><artifactId&…

13年测试老鸟,接口性能测试-压测总结汇总,一文概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、概述 性能测试…

LVS负载均衡群集之NAT与DR模式

一 集群和分布式 企业群集应用概述 群集的含义 Cluster&#xff0c;集群、群集 由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;只提供一个访问入口(域名或IP地址)&#xff0c;相当于一台大型计算机。 问题&#xff1f; 互联网应用中&#xff0c;随着站点对…

leetCode刷题 4.寻找两个正序数组的中位数

目录 1. 思路 2. 解题方法 3. 复杂度 4. Code 题目&#xff1a; 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&…