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];
}

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

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

相关文章

Java SE入门及基础(55) Stream流及常用API

目录 第一节 Stream 流 1. 管道 2.如何获取 Stream 流 Collection 接口 Stream 接口 示例 3. Stream 流中间聚合操作 Stream 接口 示例 4. Stream 流终结操作 示例 5. Stream 流聚合操作与迭代器的区别 面试题 第一节 Stream 流 1. 管道 管道 A pipeline is a …

ARM架构简明教程

目录 一、ARM架构 1、RISC指令集 2、ARM架构数据类型的约定 2.1 ARM-v7架构数据类型的约定 2.2 ARM-v8架构数据类型的约定 3、CPU内部寄存器 4、特殊寄存器 4.1 SP寄存器 4.2 LR寄存器 4.3 PC寄存器 二、汇编 1、汇编指令&#xff08;常用&#xff09; 2、C函数的…

oracle数据库日常保养或巡检语句实践整理汇总

目录 1.目的 2.操作工具 3.实践说明 1.检查Oracle实例状态 2.检查Oracle在线日志状态 3.检查Oracle表空间状态 4.检查Oracle所有数据文件状态 5.检查Oracle数据库连接情况 6.检查Oracle表容量占用大小 7.检查Oracle备份 8.检查数据库表空间的使用情况 4.总结 1.目的 …

TSINGSEE青犀云边端技术如何助力视频监控实现高效管理与安全监控

随着信息技术的飞速发展&#xff0c;视频监控作为维护公共安全的重要手段&#xff0c;正逐渐融入人们的日常生活。在这个大数据、云计算、物联网等技术深度融合的时代&#xff0c;云边端技术作为一种新兴的技术架构&#xff0c;为视频监控带来了前所未有的变革与机遇。本文将以…

matlab 路面点云标线提取

目录 一、算法原理二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 算法来自本人自创。实现效果如下图所示,具体实现原理看代码即可。 二、代码实现 clc; cle…

@PathVariable`

PathVariable 是 Spring 框架中的一个注解&#xff0c;用于从请求的 URL 路径中提取变量并将其传递给控制器方法的参数。这在 RESTful 风格的 Web 服务中非常常见&#xff0c;通常用于处理路径参数。 使用场景 在 RESTful API 中&#xff0c;我们经常需要在 URL 路径中传递一…

办公楼导航系统:设计要点、功能实现与效益评估

随着现代办公楼的日益复杂化和规模化&#xff0c;如何高效、便捷地在楼宇内部进行定位和导航&#xff0c;已成为众多企业和员工关注的焦点。维小帮办公楼定位导航系统通过精准的定位和智能的导航功能&#xff0c;能够显著提升办公环境的智能化水平和办公效率。 一、维小帮办公…

k8s快速上手实操

前言 Kubernetes&#xff08;简称K8s&#xff09;是由Google开源的一个用于自动化部署、扩展和管理容器化应用程序的系统。自2014年发布以来&#xff0c;Kubernetes已经迅速成长为容器编排领域的标准&#xff0c;并在全球范围内得到了广泛的采用和认可。 Kubernetes作为现代容…

Mcgs屏幕脚本程序

目录 1.脚本程序概述1.1 脚本程序简介1.2 脚本程序编辑环境 2.脚本程序语言要素2.1 变量和常量2.2 对象2.3 事件2.4 表达式2.5 联行符2.6 运算符2.7 系统函数 3. 基本语句3.1 赋值语句3.2 条件语句3.3 循环语句3.4 跳出语句3.5 退出语句3.6 注释语句3.7 声明语句3.6 命名规则 1…

threejs视频融合 webgl

threejs三维视频融合 let objList []; const clock new THREE.Clock(); const container document.getElementById( container );const stats new Stats(); container.appendChild( stats.dom );const renderer new THREE.WebGLRenderer( { antialias: true } ); rendere…

Linux 防火墙 Firewall 和 Iptables 的使用

如果我们在Linux服务器的某个端口上运行了个服务&#xff0c;需要外网能访问到&#xff0c;就必须通过防火墙将服务运行端口给开启。Linux中有两种防火墙软件&#xff0c;CentOS7.0以上使用的是firewall&#xff0c;CentOS7.0以下使用的是iptables&#xff08;使用较少且不建议…

Jenkins+K8s实现持续集成(三)

接上面一篇JenkinsK8s实现持续集成&#xff08;二&#xff09;&#xff0c;K8s创建秘钥。 看secret kubectl get secret 删除secret kubectl delete secret hello-secret -n train 创建secret kubectl create secret docker-registry hello-secret --docker-server镜像仓库…

HarmonyOS【ArkUI组件--TextInput】

1.文本输入框基本用法 2. 使用文本输入框组件&#xff08;如何实现输入数字改变图片大小&#xff09; 在此博客的基础上继续编写&#xff1a;HarmonyOS【ArkUI组件--Text】-CSDN博客 ①代码如下&#xff1a; import font from ohos.font Entry Component struct Index {State …

开辟一个存储空间以存放一个结构体数据

在软件开发中&#xff0c;常常需要动态地分配和撤销内存空间&#xff0c;例如对动态链表中结点的插入与删除。在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C提供了较简便而功能较强的运算符new和delete 来取代malloc和free函数。注意&#xff1a;new和delete是运…

软件测试机申请方案

1.概述 基于移动端的产品完成开发进入测试阶段时&#xff0c;该阶段要完成产品功能准确性、兼容性、易用性、可迁移性等等&#xff0c;为了最贴近用户真实场景&#xff0c;最大程度的发现问题&#xff0c;减少产品软件上线后的回归修复成本&#xff0c;需要使用真机进行测试&am…

白酒:酒文化传承中的挑战与机遇

随着时代的变迁&#xff0c;酒文化传承面临着许多挑战与机遇。我们来看看酒文化传承面临的挑战。随着现代生活方式的改变&#xff0c;人们对于传统酒文化的认知逐渐淡化。与此同时&#xff0c;年轻一代对于酒文化的兴趣不如老一辈浓厚&#xff0c;这使得酒文化的传承面临断层的…

vben-admin

table <style scoped lang"scss"></style><template><div><BasicTable register"registerTable"><template #toolbar><Button type"primary" click"handleCreatedAdd">添加</Button>…

每日复盘-202406018

今日关注&#xff1a; 20240617 20240618 六日涨幅最大: ------1--------300868--------- 杰美特 五日涨幅最大: ------1--------300868--------- 杰美特 四日涨幅最大: ------1--------300868--------- 杰美特 三日涨幅最大: ------1--------300462--------- 华铭智能 二日涨…

梅雨季机房运维注意事项

就在今天&#xff0c;江淮流域正式入梅啦。梅雨季雨水丰沛&#xff0c;机房运维要特别注意这些方面&#xff0c;以确保设备安全运行和数据中心的环境稳定。 首先&#xff0c;要防潮 具体措施 1、检查屋顶和墙壁密封性&#xff0c;确保机房屋顶和墙壁的密封性良好&#xff0c…

如何用 Google Chrome 浏览器浏览经过 XSLT 渲染的 XML 文件

对于经过XSLT渲染的XML文件&#xff0c;本来&#xff0c;可以直接用 IE (Internet Explorer) 打开&#xff0c;就能看到渲染之后的样子&#xff0c;很方便。但是后来&#xff0c;微软把 IE 换成了 Microsoft Edge&#xff0c;按理说这是比 IE 更先进的浏览器&#xff0c;可是偏…