代码随想录算法训练营第四十四天 | 力扣 518. 零钱兑换 II, 377. 组合总和 Ⅳ

news2024/11/25 11:54:13

完全背包

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

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

01背包和完全背包唯一不同就是体现在遍历顺序上

518. 零钱兑换 II

题目

518. 零钱兑换 II

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。

假设每一种面额的硬币有无限个。 

题目数据保证结果符合 32 位带符号整数。

解析

1.确定dp数组以及下标的含义

dp[j]:凑成总金额j的货币组合数为dp[j]

2.确定递推公式

dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。

所以递推公式:dp[j] += dp[j - coins[i]];

3.dp数组如何初始化

首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。如果dp[0] = 0 的话,后面所有推导出来的值都是0了。

4.确定遍历顺序

本题要求凑成总和的组合数,元素之间明确要求没有顺序。

所以纯完全背包是能凑成总和就行,不用管怎么凑的。

本题是求凑出来的方案个数,且每个方案个数是为组合数。

那么本题,两个for循环的先后顺序可就有说法了。

外层for循环遍历物品(钱币),内层for遍历背包(金钱总额)的情况。

代码如下:

for (int i = 0; i < coins.size(); i++) { // 遍历物品
    for (int j = coins[i]; j <= amount; j++) { // 遍历背包容量
        dp[j] += dp[j - coins[i]];
    }
}

假设:coins[0] = 1,coins[1] = 5。

那么就是先把1加入计算,然后再把5加入计算,得到的方法数量只有{1, 5}这种情况。而不会出现{5, 1}的情况。

所以这种遍历顺序中dp[j]里计算的是组合数!

5.举例推导dp数组

输入: amount = 5, coins = [1, 2, 5] ,dp状态图如下:

Java代码实现

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. 组合总和 Ⅳ

题目

377. 组合总和 Ⅳ

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

解析

1.确定dp数组以及下标的含义

dp[i]: 凑成目标正整数为i的排列个数为dp[i]

2.确定递推公式

dp[i](考虑nums[j])可以由 dp[i - nums[j]](不考虑nums[j]) 推导出来。

因为只要得到nums[j],排列个数dp[i - nums[j]],就是dp[i]的一部分。

求装满背包有几种方法,递推公式一般都是dp[i] += dp[i - nums[j]];

3.dp数组如何初始化

因为递推公式dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为1,这样递归其他dp[i]的时候才会有数值基础。

初始化为0,这样才不会影响dp[i]累加所有的dp[i - nums[j]]。

4.确定遍历顺序

个数可以不限使用,说明这是一个完全背包。

得到的集合是排列,说明需要考虑元素之间的顺序。

本题要求的是排列,那么这个for循环嵌套的顺序可以有说法了。

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!

所以本题遍历顺序最终遍历顺序:target(背包)放在外循环,将nums(物品)放在内循环,内循环从前到后遍历

5.举例来推导dp数组

我们再来用示例中的例子推导一下:

Java代码实现

public int combinationSum4(int[] nums, int target) {
    int[] dp = new int[target + 1];
    dp[0] = 1;
    for (int i = 0; i <= target; i++) {
        for (int j = 0; j < nums.length; j++) {
            if (i >= nums[j]) {
                dp[i] += dp[i - nums[j]];
            }
        }
    }
    return dp[target];
}

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

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

相关文章

SpringCloud(1)

文章目录 1.认识微服务1.0.学习目标1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&…

【C数据结构】单链表的基本操作(多功能+思路+图解+代码备注+完整代码+效果图)

文章目录 前言1、单链表的定义2、结点的申请3、单链表的插入3.1、头插3.2、尾插3.3、在第i位插入 4、单链表的删除4.1、头删4.2、尾删4.3、在第i位删除 6、单链表的查找6.1、按值查找6.2、按位查找6.3、两者查找到后的更多的操作&#xff1a;插入操作&#xff1a;6.3.1、在第po…

Java中BitSet和Set统计不重复字符数量时间复杂度和空间复杂度分析

题目:HJ10 字符个数统计 牛客网上一道简单的题目&#xff0c;计算字符串中含有的不同字符的个数&#xff0c;一看这个题目&#xff0c;通常直接意识到方案的基本实现思路&#xff1a;设置一个容器&#xff0c;遍历字符串中的每个字符&#xff0c;若字符与容器中字符相同&#…

chatgpt赋能python:Python中求最大公约数的方法及实现

Python中求最大公约数的方法及实现 在数学中&#xff0c;最大公约数是指两个或多个整数的共同约数中最大的一个。对于Python开发工程师来说&#xff0c;求最大公约数是一个非常基本的操作&#xff0c;尤其在处理算法或数学题目时更加常见。本篇文章就是为了帮助大家更好的理解…

华为OD机试真题B卷 Java 实现【最长子字符串的长度】

一、题目描述 给你一个字符串s&#xff0c;字符串s首尾相连组成一个环形&#xff0c;请你在环形中找出‘o’字符出现了偶数次最长子字符串的长度。 二、输入描述 输入一串小写字母组成的字符串。 三、输出描述 输出一个整数。 四、解题思路 题目要求在给定的环形字符串中…

kong网关安装及konga安装

一、kong安装 安装机器地址&#xff1a;192.168.19.50 1、自定义一个docker网络 [rootmin ~]# docker network create kong-net a9bde4e7d16e4838992000cd5612476b238f7a88f95a07c994a9f57be7f64c10查看网络是否创建成功 [rootmin ~]# docker network ls NETWORK ID NA…

3DMAX车缝线生成器插件使用方法详解

3dMax车缝线生成器插件,用于创建缝合对象和一个对象,以沿样条线或仅通过绘制选定边上的缝合之间的孔。 目前有两种类型的缝线,圆形缝线和平面缝线。对于给定类型的针脚,它们的厚度是最常用的。缝线的长度和间距以及旋转都可以很容易地调整,这些参数也可以随机设置,以创造…

vscode + CMake 构建C语言项目

文章目录 1. 所需工具2. 配置1. 编写顶级目录下的 CMakeLists.txt2. 编写子目录 src 里的 CMakeLists.txt3. 添加测试文件4. 开始构建 1. 所需工具 Visual Stduio Code&#xff08;vscode&#xff09; CMake 简介&#xff1a; CMake 是一个跨平台的 构建工具&#xff0c;用于 …

[论文阅读73]Prefix-Tuning:Optimizing Continuous Prompts for Generation

1. 基本信息 题目论文作者与单位来源年份Prefix-Tuning&#xff1a;Optimizing Continuous Prompts for GenerationXiang Lisa Li等 Stanford UniversityAnnual Meeting of the Association for Computational Linguistics2021 Citations 1009, References 论文链接&#xf…

基于java的超市管理系统设计与实现

摘 要 随着小型超市规模的发展不断扩大&#xff0c;商品数量急剧增加&#xff0c;有关商品的各种信息量也成倍增长&#xff0c;传统的人工记忆方式也慢慢的无法适应形势的变化。随着信息技术的发展&#xff0c;计算机已被广泛的用于社会的各个领域&#xff0c;成为推动社会发…

EMNLP - 征集系统演示

Call For System Demonstrations - EMNLP 2023 EMNLP 2023 系统演示计划委员会邀请演示计划的提案。演示范围从早期研究原型到成熟的生产就绪系统。特别感兴趣的是公开可用的开源或开放访问系统。鉴于自然语言处理领域的理论和应用研究的现状&#xff0c;我们还强烈鼓励展示技术…

利用画图以及代码分析详细解读外排序的实现过程

外排序的实现 思想代码分析完整代码 如果有海量数据需要排序&#xff0c;而在内存中放不下这么多数据&#xff0c;因此就不能使用内排序&#xff08;直接插入排序&#xff0c;希尔排序&#xff0c;堆排序&#xff0c;快速排序&#xff0c;归并排序等等&#xff09;。关于想了解…

Java利用JOL工具分析对象分布

对象的组成 对象头[Header] Markword&#xff1a;存储对象自身运行时数据如hashcode、gc分代年龄等&#xff0c;64位系统总共占用8个字节&#xff0c;关于Markword详细内存分布如下 类型指针&#xff1a;对象指向类元数据地址的指针&#xff0c;jdk8默认开启指针压缩&#xff…

算法基础学习笔记——⑫最小生成树\二分图\质数\约数

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;算法基础学习 目录 ✨最小生成树 &#x1f353;朴素Prim &#x1f353;Kruskal算法 ✨二分图 &#x1f353;匈牙利算法 ✨质数 &#x1f353;&#xff08;1&#xff09;质数的判定——试除法 &#x1f353;&#xff08;2&…

简单认识OSI(计算机网络分层)七层模型

前言 学校上课讲的太笼统啥也不是&#xff0c;自己学的太玄学似懂非懂突然在看到了一篇公众文文章。文章从初始到现在&#xff0c;步步为营的遇到一个解决一个前人的问题&#xff0c;有了细致入微的讲述&#xff0c;把之前学的死东西都连起来了。 如果让你来设计网络https://m…

chatgpt赋能python:Python取余数:介绍和实际应用

Python取余数&#xff1a;介绍和实际应用 Python是一种高级编程语言&#xff0c;其灵活性和多功能性使其成为开发者的首选之一。在Python中&#xff0c;取余数是常见的数学运算之一&#xff0c;这个操作在编写程序时非常有用。在本文中&#xff0c;我们将介绍Python中的取余数…

chatgpt赋能python:Python中单行输出的使用方法

Python中单行输出的使用方法 Python是广泛使用的高级编程语言之一&#xff0c;具有易于学习、可读性强和简单易用等优点。在Python编程中&#xff0c;我们经常需要输出文本内容&#xff0c;而Python中单行输出便是一个非常重要的功能。 什么是单行输出 单行输出是指将多个元…

TDengine 深入解析缓存技术

TDengine是一款高性能的物联网大数据平台。为了高效处理时序数据&#xff0c;TDengine中大量用到了缓存技术&#xff0c;自己实现了哈希表、缓存池等技术。本文会为大家讲解TDengine中用到的这些缓存技术。 首先会介绍一下什么是缓存&#xff0c;常用的缓存技术&#xff0c;最后…

想知道怎么翻译多个文本?我教你三个好方法吧

随着电子商务的全球化发展&#xff0c;越来越多的企业意识到将产品推向全球市场的重要性。在全球市场中&#xff0c;各种语言和文化的消费者都存在着巨大的潜在需求。为了吸引和服务这些不同语言的客户&#xff0c;企业需要采取一系列的措施&#xff0c;其中翻译是至关重要的一…

科技发展的那些事儿

近30年来&#xff0c;科技发展取得了惊人的成就&#xff0c;涉及范围广泛&#xff0c;包括计算机科学、通讯技术、生物医学、能源等多个领域。本文将列举近30年来科技发展的重要事件&#xff0c;并探讨这些事件对我们的生活、工作和社会产生的影响。 1991年&#xff0c;Linux操…