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]=1dp[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];}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第 5 章 ROS常用组件动态坐标变换(自学二刷笔记)

5.1.3 动态坐标变换 所谓动态坐标变换&#xff0c;是指两个坐标系之间的相对位置是变化的。 需求描述: 启动 turtlesim_node&#xff0c;该节点中窗体有一个世界坐标系(左下角为坐标系原点)&#xff0c;乌龟是另一个坐标系&#xff0c;键盘控制乌龟运动&#xff0c;将两个坐…

书籍强烈推荐:“计算机界三大神书”之一 ——SICP

文章目录 1. 书籍推荐2. 粉丝福利3. 自主购买 1. 书籍推荐 《计算机程序的构造和解释》&#xff08;Structure and Interpretation of Computer Programs&#xff0c;简记为 SICP&#xff09;是MIT的基础课教材&#xff0c;出版后引起计算机教育界的广泛关注&#xff0c;对推动…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Checkbox)

提供多选框组件&#xff0c;通常用于某选项的打开或关闭。 说明&#xff1a; API version 11开始&#xff0c;Checkbox默认样式由圆角方形变为圆形。 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口…

Android视角看鸿蒙第一课(工程目录)

Android视角看鸿蒙第一课&#xff08;工程目录&#xff09; 导读 鸿蒙马上就来了&#xff0c;这个工作很有可能落到Android开发的头上&#xff0c;既是机遇也是挑战&#xff0c;希望能跟上时代的浪潮&#xff0c;迫不得已开始学习鸿蒙开发&#xff0c;顺带分享记录下 我的学…

数据结构界的终极幻神----树

目录 一.数的概念和分类 种类 二.重点概念 哈希树: 二叉树的线索化 什么是线索化 为什么要线索化 特殊的查找树 完全二叉树 三.手撕完全二叉树(堆) 重点讲解 向上搜索算法 向下搜索算法 一.数的概念和分类 树&#xff08;tree&#xff09;是包含 n(n≥0) [2] 个节…

影响APP广告变现收益的4个关键因素

APP的广告收入&#xff08;IAA&#xff09;展示 * eCPM/1000 IAA收入其实是由广告总展示量和每次展示的平均收入共同决定的。所以&#xff0c;提高IAA收入&#xff0c;我们需要双管齐下&#xff1a;同时提高广告总展示量和平均每次展示的收入。 app广告变现对接点击⬇️链接&…

全志D1s开发板裸机开发之坏境搭建

环境搭建 开发板介绍 张天飞老师编写的《RISC-V体系结构编程与实践》&#xff0c;里面的源码是基于 QEMU 模拟器的&#xff0c;可以认为它是一款虚拟的开发板。如果需要在真实开发板上学习&#xff0c;可以使用百问网的 DongshanPI-D1S 开发板。 DongshanPI-D1S 是百问网推出…

Sora:AI视频生成的新机遇与挑战

随着科技的飞速进步&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;技术已经深入渗透到社会的各个领域。其中&#xff0c;Sora这类基于AI的视频生成工具因其高度逼真的生成能力而备受瞩目。然而&#xff0c;正如一枚硬币有两面&#xff0…

算法刷题Day2 | 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

目录 0 引言1 有序数组列表1.1 我的题解&#xff08;双指针&#xff09;1.2 根据官方解题修改后 2 长度最小的子数组2.1 我的题解2.2 官方滑动窗口&#xff08;双指针&#xff09;题解 3 螺旋矩阵3.1 我的题解 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&…

VUE_自适应布局-postcss-pxtorem,nuxt页面自适配

postcss-pxtorem是一个PostCSS插件&#xff0c;用于将CSS中的像素值转换为rem单位&#xff0c;以实现响应式布局和适配不同屏幕尺寸的需求。 它的适配原理是将CSS中的像素值除以一个基准值&#xff0c;通常是设计稿的宽度&#xff0c;然后将结果转换为rem单位。这样&#xff0…

【MySQL】lower_case_table_names作用及使用

知识点&#xff1a; lower_case_table_names 是mysql设置大小写是否敏感的一个参数。 场景&#xff1a;在使用dataease时&#xff0c;连接外部数据库&#xff0c;启动报错&#xff01;后查看官方文档&#xff0c;特别要求改数据库配置文件&#xff1a;lower_case_table_names …

让照片说话唱歌的软件,盘点这3款!

在数字时代&#xff0c;我们总是渴望找到新的方式来表达自我、分享生活。近年来&#xff0c;随着人工智能和图像处理技术的飞速发展&#xff0c;一种新型的软件应运而生&#xff0c;它们能够让照片“说话”甚至“唱歌”&#xff0c;给我们的生活带来了无限乐趣和创意空间。那么…