当前位置: 首页 > news >正文

leetcode322零钱兑换(背包问题)

目录

题目

背包状态转移方程

0-1背包

完全背包

解决方案


题目

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

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

背包状态转移方程

0-1背包

weight[]={1,3,1} 表示物品的重量,value[] ={15,30,20}表数物品的价值,  求背包承受重量是maxWeight  = 4时,这个背包能够装的重大价值。

dp[i][j]表示,前i个物品,重量为j时的最大价值。

0-1背包dp[i][j]求值可以转换成2种情况

 dp[i-1][j]   第i个物品不放入背包的价值

dp[i-1][j-weight[i]]+value[i]   第i个物品放入背包的价值

}

(1)转移方程

  二维数组

dp[i][j] = max {  dp[i-1][j]    ,   dp[i-1][j-weight[i]]+value[i] }

 一维数组

dp[j] = max{ dp[j], dp[j-weight[i]]+value[i]   }

一维很难理解,今天看到一个别的的理解

dp[j]= max{dp[j],dp[j-weight[i]]+value[i] }

(2)代码实现

二维数组方案

public static int maxValue(int[] weight, int[] value, int maxWeight) {int n = weight.length;if (n == 0) return 0;int[][] dp = new int[n + 1][maxWeight + 1];for (int i = 1; i <= n; i++) {for (int k = 1; k <= maxWeight; k++) {// 存放 i 号物品(前提是放得下这件物品)if(k>=weight[i-1]){dp[i][k] = Math.max(dp[i - 1][k], dp[i-1][k-weight[i-1]]+value[i-1]);}else{dp[i][k] = dp[i - 1][k];}}}return dp[n][maxWeight];
}

一维数组方案

需要注意,状态转移方程是从后往前推。跟完全背包不一样 

    public static int maxValue(int[] weight, int[] value, int W) {int n = weight.length;if (n == 0) return 0;int[] dp = new int[W + 1];for (int i = 0; i < n; i++) {//只要确保 k>=weight[i] 即可,而不是 k>=1,从而减少遍历的次数for (int k = W; k >= weight[i]; k--) {dp[k] = Math.max(dp[k - weight[i]] + value[i], dp[k]);}}return dp[W];}

完全背包

二维数组

dp[i][j] = max{    dp[i-1][j],      dp[i][j-weight[i]]+value[i]}

一维数组

dp[j] = max{ dp[j], dp[j-weight[i]]+value[i]   }

完全背包和0-1背包,状态转移方程很像,只有标红部分不同。

解决方案

回到322这个题目,这题是完全背包问题

dp[i][j]表示前N种硬币,总金额是j时,最少的数据量。

dp[i][j]=min{dp[i-1][j],   dp[i][j-coin[i]]+1 }

初始化dp[0][0]=0,默认金币个数是0时,都是不可实现方案,初始化dp[0][i]等于某个很大的值

public static int coinChange(int[] coins, int amount) {if (amount == 0) {return 0;}int[][] dp = new int[coins.length + 1][amount + 1];int initValue = Integer.MAX_VALUE / 2;dp[0][0] = 0;for (int i = 1; i < amount + 1; i++) {dp[0][i] = initValue;}for (int i = 1; i < coins.length + 1; i++) {for (int j = 0; j <= amount; j++) {if (j >= coins[i - 1]) {dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - coins[i - 1]] + 1);} else {dp[i][j] = dp[i - 1][j];}}}return dp[coins.length][amount] == initValue ? -1 : dp[coins.length][amount];}

一维实现方案

public static int coinChange1(int[] coins, int amount) {if (amount == 0) {return 0;}int[] dp = new int[amount + 1];int initValue = Integer.MAX_VALUE / 2;Arrays.fill(dp, initValue);dp[0] = 0;for (int i = 1; i < coins.length + 1; i++) {for (int j = coins[i - 1]; j < amount+1; j++) {dp[j] = Math.min(dp[j], dp[j - coins[i - 1]] + 1);}}return dp[amount] == initValue ? -1 : dp[amount];
}

相关文章:

  • 图像分割(三)-RGB转HSV后图像分割方法
  • USB学习——12、usb初始化和插拔驱动软件流程大致框架描述
  • HTML静态网页成品作业(HTML+CSS)——美食火锅介绍网页(1个页面)
  • Autodesk Revit产品痛点
  • 力扣1793.好子数组的最大分数
  • 德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第十周) - 自然语言处理应用
  • 基于Django的博客系统之增加手机验证码登录(九)
  • idea intellij 2023打开微服务项目部分module未在左侧项目目录展示(如何重新自动加载所有maven项目model)
  • 使用 Iceberg、Tabular 和 MinIO 构建现代数据架构
  • C++ | Leetcode C++题解之第149题直线上最多的点数
  • 《沃趣 分手后霸道少爷宠爆我》盛大开机典礼
  • 安装MySQL5.7版本步骤遇到问题
  • Web服务器
  • PHP中的while循环:用法、技巧与最佳实践
  • Studying-代码随想录训练营day16| 513找到左下角的值、112.路径总和、106从中序与后序遍历序列构造二叉树
  • [iOS]Core Data浅析一 -- 启用Core Data
  • “大数据应用场景”之隔壁老王(连载四)
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • js学习笔记
  • mysql外键的使用
  • vue-router 实现分析
  • vue学习系列(二)vue-cli
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 讲清楚之javascript作用域
  • 利用DataURL技术在网页上显示图片
  • 驱动程序原理
  • 思维导图—你不知道的JavaScript中卷
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 小程序开发中的那些坑
  • 一道闭包题引发的思考
  • 优化 Vue 项目编译文件大小
  • 源码安装memcached和php memcache扩展
  • const的用法,特别是用在函数前面与后面的区别
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Nginx实现动静分离
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # wps必须要登录激活才能使用吗?
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (第二周)效能测试
  • (六)激光线扫描-三维重建
  • (四)Controller接口控制器详解(三)
  • (五)网络优化与超参数选择--九五小庞
  • (循环依赖问题)学习spring的第九天
  • (杂交版)植物大战僵尸
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .Net 6.0 Windows平台如何判断当前电脑是否联网
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .NET学习教程二——.net基础定义+VS常用设置
  • @ModelAttribute使用详解