数据结构学习 Leetcode322 零钱兑换

关键词:动态规划 完全背包 记忆化搜索

一个套路:

  • 01背包:空间优化之后dp【target+1】,遍历的时候要逆序遍历
  • 完全背包:空间优化之后dp【target+1】,遍历的时候要正序遍历

题目:

方法一:

动态规划 完全背包

思路:

就是一个完全背包问题。有无限个相同的硬币。目标就是amount。

状态:dp[j]判断在放第i种硬币时,凑成目标金额为j所需要的最少硬币个数。(进行了滚动数组进行空间优化,正序遍历)

转移方程: dp[j]=min(dp[j],dp[j-coins[i]]+1)

  • 如果选dp[j]:不加这个硬币。
  • 如果选dp[j-coins[i]]+1:加这一个硬币。

初始条件:因为是找最小值,所以dp初始值设置成一个比较大的值,我设了1e5。

边界条件:初始条件里面,dp[0]要特别设置出来,dp[0]=0。因为在目标为0元、什么硬币都不用的时候,所需要的最少硬币个数为0。

画了一个dp状态推理过程的表格。纵坐标是j,横坐标是i。实际上dp状态是一维的,长度为amount+1,coins维被空间优化了。

amount\coins0125
00
1100001
21000021
31000032
41000042
510000531
610000632
710000742
810000843
910000953
10100001052
11100001163

 复杂度计算:

  • 时间复杂度O(nm) n为amount m为coins.size()
  • 空间复杂度O(n) n为amount

代码:

#include <vector>
#include <iostream>
class Solution {
public:int coinChange(std::vector<int>& coins, int amount) {if (amount == 0) return 0;std::vector<int> dp(amount + 1,1e5);dp[0] = 0;for (int i = 0; i < coins.size(); ++i){for (int j = coins[i]; j <= amount; ++j){dp[j] = std::min(dp[j], dp[j - coins[i]] + 1);}}if (dp[amount] == 1e5) return -1;else return dp[amount];}
};

方法二:

动态规划 记忆化

思路:

记忆化:把之前算过的状态记下来,减少搜索。

 复杂度计算:

  • 时间复杂度O(nm) n为amount m为coins.size()
  • 空间复杂度O(n) n为amount

 代码:

class Solution {std::vector<int>count;int dp(std::vector<int>& coins, int rem){if (rem < 0)return-1;if (rem == 0)return 0;if (count[rem - 1] != 0)return count[rem - 1];int min = INT_MAX;for (const auto& coin : coins){int res = dp(coins, rem - coin);if (res >= 0 && res < min){min = res + 1;//为什么要加个1}}count[rem - 1] = min == INT_MAX ? -1 : min;return count[rem - 1];}
public:int coinChange(std::vector<int>& coins, int amount) {if (amount < 1) return 0;count.resize(amount);return dp(coins, amount);}
};

题目二:

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

思路:

和上面唯一不同的是求的是凑成总金额的硬币组合数

其实是基本一样的思路,主要是改变转移方程。

状态:dp[j]判断在放第i种硬币时,凑成目标金额为j的硬币组合数。(进行了滚动数组进行空间优化,正序遍历)

转移方程: dp[j]=dp[j]+dp[j-coins[i]]

  • dp[j]:不加这个硬币,凑成j的组合数。
  • dp[j-coins[i]]:加这一个硬币,凑成j的组合数。

初始条件:因为是找总和,所以dp初始值设置成0。

边界条件:初始条件里面,dp[0]要特别设置出来,dp[0]=1。因为在凑0元的时候,有一个方法就是啥都不放。

画了一个dp状态推理过程的表格。纵坐标是j,横坐标是i。实际上dp状态是一维的,长度为amount+1,coins维被空间优化了。

amount\coins0125
01
101
2012
3012
4013
50134
60145
70146
80157
90158
1001610
1101611

 复杂度计算:

  • 时间复杂度O(nm) n为amount m为coins.size()
  • 空间复杂度O(n) n为amount

代码:

#include <vector>
#include <iostream>
//和前面问题不一样:
//给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。
class Solution {
public:int coinChange(std::vector<int>& coins, int amount) {if (amount == 0) return 0;std::vector<int> dp(amount + 1, 0);dp[0] = 1;for (int i = 0; i < coins.size(); ++i){for (int j = coins[i]; j <= amount; ++j){dp[j] += dp[j - coins[i]];}}return dp[amount];}
};

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

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

相关文章

大数据 - 大数据入门第一篇 | 关于大数据你了解多少?

&#x1f436;1.1 概述 大数据&#xff08;BigData):指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据主要解决、海量数据的采…

VMware安装RHEL9.0版本Linux系统

最近在学习Linux&#xff0c;安装了Red Hat Enterprise Linux 的 9.0版本&#xff0c;简称RHEL9.0。RHEL9.0是Red Hat公司发布的面向企业用户的Linux操作系统的最新版本。我把它安装在虚拟机VMware里来减少电脑性能占用&#xff0c;也防止系统炸搞得我后面要重装。安装RHEL9.0还…

简单的springboot项目

传参方式 URL 传参 URL 传参的两种常见方式是通过查询参数和路径参数。 查询参数&#xff1a; 查询参数是通过在 URL 后面使用 ? 字符&#xff0c;然后以 keyvalue 的形式添加到 URL 中。多个查询参数之间使用 & 符号分隔。例如&#xff1a;https://example.com/api?…

[每周一更]-(第40期):GIT更换远程仓库地址

方法一 通过命令直接修改远程地址 进入git_test根目录 git remote 查看所有远程仓库&#xff0c; git remote xxx 查看指定远程仓库地址 git remote set-url origin https://git.dev.tencent.com/ifanatic/2H.git方法二 通过命令先删除再添加远程仓库 1.进入git_test根目录 2…

推荐:一个不错的介绍Apache Doris的PPT

原来Apache Doris居然是百度开源出来的&#xff0c;不错。部分节选&#xff1a;完整下载地址网盘&#xff1a; 链接: https://pan.baidu.com/s/18WR70R_f72GxCjh0lykStQ 提取码: umd3 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v7的分…

鸿蒙 DevEco Studio 3.1 入门指南

本文主要记录开发者入门&#xff0c;从软件安装到项目运行&#xff0c;以及后续的学习 1&#xff0c;配置开发环境 1.1 下载安装包 官网下载链接 点击立即下载找到对应版版本 下载完成&#xff0c;按照提示默认安装即可 1.2 下载SDK及工具链 运行已安装的DevEco Studio&…

unknown variable ‘authentication_policy=mysql_native_password‘

unknown variable authentication_policymysql_native_password 背景解决尝试一尝试二(解决) 总结 背景 mac上安装多个版本数据库。我是通过dmg安装的&#xff0c;先装的5.7&#xff0c;再装的5.8&#xff0c;然后5.8的能正常用&#xff0c;5.7的启动不起来。报错信息为如下 …

【深度学习:Few-shot learning】理解深入小样本学习中的孪生网络

【深度学习&#xff1a;Few-shot learning】理解深入小样本学习中的孪生网络 深入理解孪生网络&#xff1a;架构、应用与未来展望小样本学习的诞生元学习小样本学习孪生网络的基本概念孪生网络的细节Triplet Loss架构特点关键组件训练过程主要应用领域未来展望示例图片结论 备注…

基于PHP的高校学生宿舍信息系统

有需要请加文章底部Q哦 可远程调试 基于PHP的高校学生宿舍系统 一 介绍 此学生宿舍信息系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端jquery.js。系统角色分为学生&#xff0c;辅导员和宿管员。(附带配套设计文档) 技术栈&#xff1a;phpmysqljquery.jsphpstu…

使用uni-app editor富文本组件设置富文本内容及解决@Ready先于onload执行,无法获取后端接口数据的问题

开始使用富文本组件editor时&#xff0c;不知如何调用相关API设置富文本内容和获取内容&#xff0c;本文将举例详解 目录 一.了解editor组件的常用属性及相关API 1.属性常用说明 2.富文本相关API说明 1&#xff09;editorContext 2&#xff09; editorContext.setContents…

微信小程序开发系列-10组件间通信01

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》 《微信小程序开发系列-02注册小程序》 《微信小程序开发系列-03全局配置中的“window”和“tabBar”》 《微信小程序开发系列-04获取用户图像和昵称》 《微信小程序开发系列-05登录小程序》 《…

Android Matrix画布Canvas旋转Rotate,Kotlin

Android Matrix画布Canvas旋转Rotate&#xff0c;Kotlin private fun f1() {val originBmp BitmapFactory.decodeResource(resources, R.mipmap.pic).copy(Bitmap.Config.ARGB_8888, true)val newBmp Bitmap.createBitmap(originBmp.width, originBmp.height, Bitmap.Config.…