dp专题13 零钱兑换II

本题链接:. - 力扣(LeetCode)

题目:

思路:

        根据题意,这是一道很裸的背包问题,其中这里是返回 背包方案数 的。

我们可以直接推出公式 : dp [ j ] += dp[ j - coins[ i ] ]

在我之前做的笔记中,写过具体的背包方案数dp公式,参考我之前的详解即可:dp专题10 目标和 

最后我们再明确一下题目,题目要求是  硬币数量是无限的,说明这是一个 完全背包问题。

完全背包问题 和 01 背包问题区别在于 遍历背包的顺序。

01   背包的  背包 遍历顺序: 逆向。

完全背包的  背包 遍历顺序: 正向。

具体原理是:

背包 逆向 遍历的时候,  物品只能 取 1 次.(01 背包)

代码详解:


for(int i = 0;i < goods.size();++i)
{
    for(int j = v;j >= goods[i].v;--j)
    {
        dp[j] = max(dp[j],dp[j - goods.v] + goods.w);
    }
}

/*

  逆向 的时候,  j == 背包容量(v)   时, 只能取当前的一个 物品 i  
                随后随着 --j   后面  dp[j]  紧随其后  只取一个物品 i       
                所以达到了,只取 一次 的效果
*/   

 背包 正向 遍历的时候,  物品可以取多次.(完全 背包)

代码详解:


for(int i = 0;i < goods.size();++i)
{
    for(int j = goods[i].v;j <= v;++j)
    {
        dp[j] = max(dp[j],dp[j - goods.v] + goods.w);
    }
}

/*

  正向 的时候,  j == 物品容量(goods.v)   时, 取当前的一个 物品 i  
                随后随着 ++j   后面  dp[j]  紧随其后 取一个物品 i       
                直到达到了 dp[v] ,使得 物品 i 取了多次
*/   

所以 完全背包问题 和 01 背包问题区别在于 遍历背包的顺序。

同样的道理,我们结合dp递推的公式 + 背包遍历顺序,就可以解出这道完全背包问题方案数的问题了。

在这里再扩展一下问题,遍历顺序中,先遍历背包还是先遍历物品?

我们再看一下这两种遍历方法的效果:

①先遍历物品再遍历背包


for(int i = 0;i < goods.size();++i)    // 遍历物品
{
    for(int j = goods[i].v;j <= v;++j)    // 遍历背包
    {
        dp[j] = max(dp[j],dp[j - goods.v] + goods.w);
    }
}

/*
    假设 物品 等于 下标

    那么背包会得到的集合是:
    
    {1} 
    {1,2} , {2}
    {1,2,3} , {2,3} , {3}
    ....
    
    获取的集合中不会出现 {2,1}... 等集合

    说明 先遍历物品再遍历背包是一个  组合 数
  
*/   

②先遍历背包再遍历物品

for(int j = goods[i].v;j <= v;++j)    // 遍历背包
{
    for(int i = 0;i < goods.size();++i)    // 遍历物品
    {
        dp[j] = max(dp[j],dp[j - goods.v] + goods.w);
    }
}

/*
    假设 物品 等于 下标

    那么背包会得到的集合是:
    
    {1} 
    {1,2} , {2,1} ,{2}
    ....
    
    获取的集合中会出现 {2,1}... 等集合

    说明 先遍历物品再遍历背包是一个  排列 数
  
*/   

所以 背包问题 遍历顺序中 :

先遍历物品再遍历背包: 组合 数。

先遍历背包再遍历物品: 排列 数。

综上所述。

代码详解如下:

inline int change(int& amount, vector<int>& coins) 
{
    vector<int>dp(amount + 1,0);
    dp[0] = 1;    // dp 初始化  凑成 0 有 1种方法 就是 +0
    
    // 组合数遍历
    for(int &i:coins)    // 遍历物品
    {
        for(int j = i;j <= amount;++j)    // 遍历背包
        {
            dp[j] += dp[j - i];    // dp 递推公式
        }
    }
    return dp[amount];    // 返回结果
}

最后提交:

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

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

相关文章

【Windows取证篇】Window日志分析基础知识(一)

【Windows取证篇】Window日志分析基础知识&#xff08;一&#xff09; Windows系统审计是对系统中有关安全的活动进行记录、检查以及审核&#xff0c;一般是一个独立的过程。Window自带的事件查看器并没有提供删除特定日志的功能&#xff0c;我们在系统审计取证分析时&#xf…

MySQL中根据出生日期计算年龄

创建student表 mysql> create table student( -> sid int primary key comment 学生号, -> sname varchar(20) comm…

JAVAEE初阶 文件IO练习题

文件IO练习题 一.二.三. 一. 给定一个要找寻的文件,再给定一个目录,查找是否存在这个文件,如果存在,返回它的绝对路径. 二. 实现文件的复制 将一个文件的内容复制到另一个文件中 思路: 先读文件中的内容,读完之后,以写的方式到另一个文件中 三. 进行目录的搜索,用户输入一个目录…

【网络技术】【traceroute】【Linux虚拟机(Ubuntu)】无法traceroute至谷歌【及解决方法】

一、问题描述 问题描述如下&#xff1a; Ubuntu虚拟机可以ping通谷歌&#xff08;www.google.com&#xff09;&#xff0c;但是却无法通过traceroute命令找到路由路线&#xff0c;如下图所示&#xff1a; 二、解决方法 从traceroute命令的返回内容可以看出&#xff0c;路由寻…

easy Exsel导出

目录 一、首先引入依赖 二、然后封装一个VO 三、Controller层 四、Service实现类 引用样式 自适应列宽 自适应行高 五、测试 postman ​编辑 浏览器 异常 分配到这个任务了&#xff0c;写个小demo记录下&#xff0c;具体可参考EasyExcel官方文档 我用的是web上传…

Spring5深入浅出篇:Spring与工厂设计模式简介

Spring5深入浅出篇:Spring与工厂设计模式简介 什么是Spring Spring是⼀个轻量级的JavaEE解决⽅案&#xff0c;整合众多优秀的设计模式轻量级 1. 对于运⾏环境是没有额外要求的开源 tomcat resion jetty收费 weblogic websphere 2. 代码移植性⾼不需要实现额外接⼝JavaEE的解…

常见框架漏洞

1.什么是框架 Web框架(Web framework)或者叫做Web应用框架(Web application framework)&#xff0c;是用于进行Web开发的一套软件架构。大多数的Web框架提供了一套开发和部署网站的方式。为Web的行为提供了一套支持的方法。使用Web框架&#xff0c;很多的业务逻辑外的功能不需…

介绍 sCrypt:BTC 的 Layer-1 智能合约框架

在 TypeScript 中开发 BTC 智能合约 我们非常高兴地推出 sCrypt&#xff1a;一种现代 Typescript 框架&#xff0c;用于在 BTC 上开发第一层智能合约&#xff0c;无需分叉。 现在&#xff0c;人们可以使用现代开发工具在易于使用的统一框架中编写、测试、调试、部署和调用智能合…

一键式Excel分词统计工具:如何轻松打包Python脚本为EXE

一键式Excel分词统计工具&#xff1a;如何轻松打包Python脚本为EXE 写在最前面需求分析直接用Python打包为什么大&#xff1f;为什么要使用conda环境&#xff1f; 将Python脚本打包为一个独立的应用程序1. 编写Python脚本&#xff1a;初步功能实现2. 初步图形用户界面&#xff…

大创项目推荐 深度学习的水果识别 opencv python

文章目录 0 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别 4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型 6 识别效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习…

第三届iEnglish全国ETP大赛展现教育游戏新趋势

随着社会步入数字化纪元,游戏作为信息交流和传播的重要载体,在教育领域的潜能日益凸显。特别是寓教于乐的“教育游戏”学习方式让更多家长和孩子体验到“玩中学,学中玩”的乐趣,在教育领域的潜能也日益凸显。 本周五(1月19日)晚上7点,国内首个教育游戏赛事、以“玩转英语,用iE…

Docker之安装Nginx

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Docker之Dockerfile构建镜像》。&#x1f3af;&…

瑞_JVM虚拟机_概述

文章目录 1 什么是JVM1.1 JVM功能1.2 常见的JVM1.3 常见的JVM: Java虚拟机规范1.4 常见的JVM - HotSpot的发展历程 2 JVM的组成3 字节码文件的打开方式3.1 以正确的姿势打开字节码.class文件3.1.1 NotePad的插件HexEditor3.1.2 jclasslib3.1.3 IDEA插件jclasslib 4 字节码文件的…

蓝桥杯备赛 day 2 —— 二分算法(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 二分的概念 &#x1f4c1; 整数二分 &#x1f4c1; 二分的模板 &#x1f4c1; 习题 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文章主要是准备蓝桥杯竞赛同学所写&#xff0c;为你更好准备蓝桥杯比赛涉及…

OpenHarmony 应用开发入门 (一、环境搭建及第一个Hello World)

万事开头难。难在迈出第一步。心无旁骛&#xff0c;万事可破。没有人一开始就能想清楚&#xff0c;只有做起来&#xff0c;目标才会越来越清晰。--马克.扎克伯格 前言 2024年1月16日&#xff0c;华为目前开启已HarmonyOS NEXT开发者预览版Beta招募&#xff0c;报名周期为1月15…

MS2358——96KHz、24bit 音频 ADC

产品简述 MS2358 是带有采样速率 8kHz-96kHz 的立体声音频模数 转换器&#xff0c;适合于面向消费者的专业音频系统。 MS2358 通过使用增强型双位 Δ - ∑ 技术来实现其高精度 的特点。 MS2358 支持单端的模拟输入&#xff0c;所以不需要外部器 件&#xff0c;非常适…

高密数据中心卓越运维,更灵活助力企业 AI 就绪

AIGC的高速发展将企业对基础架构的需求推上了新的层次&#xff0c;根据中国通服数字基建产业研究院发布的《中国数据中心产业发展白皮书&#xff08;2023&#xff09;》报告&#xff0c;互联网行业客户对单机柜功率密度的要求较高&#xff0c;一般在6-8kW&#xff0c;金融行业处…

使用vscode编写golang代码并交叉编译生成

文章目录 一、修改Go相关环境变量二、为vscode安装插件及依赖1、安装插件2、安装相关依赖 三、新建项目并编写代码1、打开文件夹后&#xff0c;初始化mod&#xff0c;在终端执行&#xff1a;2、新建main.go编写代码 四、运行、调试、build代码1、运行2、调试3、生成可执行文件4…

从js闭包谈到作用域、作用域链、执行上下文、内存管理

文章目录 作用域函数作用域和全局作用域块级作用域和暂时性死区执行上下文和调用栈代码执行的两个阶段调用栈闭包内存管理内存泄漏场景举例浏览器垃圾回收如何避免内存泄漏如何利用闭包实现单例模式 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄…

Spring Boot 单体应用升级 Spring Cloud 微服务

作者&#xff1a;刘军 Spring Cloud 是在 Spring Boot 之上构建的一套微服务生态体系&#xff0c;包括服务发现、配置中心、限流降级、分布式事务、异步消息等&#xff0c;因此通过增加依赖、注解等简单的四步即可完成 Spring Boot 应用到 Spring Cloud 升级。 *Spring Cloud …