编程实现背包的递归和非递归两种解法_算法动态规划(七)背包问题4

f3f563a889b7c8be298b3d3c32424b43.png

⚠️今天继续我们来探讨背包问题中的完全背包问题。完全背包:N个物品,容量为V,每个物品可以无限次使用,求达到V的最值。
???今日练习(一)零钱兑换(LeetCode-322)。给定一批硬币coins数组,每个硬币可以不限次数使用,求凑成总金额V至少需要多少个硬币。找不到输出-1。举例:
输入:[1,2,5] , 11输出:3。1+5+5=11输入:[2],3输出:-1;

?解法一:记忆化递归

?思路:

总体思路就是用coins中的每个数去凑总金额amount,用总金额减去使用过的数,直到amount小等于0退出递归。当amount==0,说明刚刚好凑齐。退出递归。使用一个map来保存递归中产生的零钱值,减少重复递归。
Mapmap = new HashMap<>();    public int coinChange(int[] coins, int amount) {        if(amount <= 0){            return 0;        }        return find_h(coins,amount);    }    private int find_h(int[] nums,int amount){        if(amount <0){            return -1;        }        if(amount == 0){            return 0;        }        if(map.containsKey(amount)){            return map.get(amount);        }        int count=Integer.MAX_VALUE;        for(int num:nums){            if(num > amount){                continue;            }            int solu=find_h(nums,amount-num);            if(solu>=0){                count = Math.min(count,solu+1);            }        }        if(count == Integer.MAX_VALUE){            count =-1;        }        map.put(amount,count);        return  map.get(amount);    }

?解法二:动态规划【自上而下】

?思路:

状态定义:F(S),凑齐总金额S,需要的最小硬币数。

状态转移方程:F(S) = F(S-coins[i]) + 1。

public int coinChange(int[] coins, int amount) {       if (amount < 1) return 0;    return coinChange_h(coins, amount,new int[amount+1]);}private int coinChange_h(int[] coins, int amount,int[] count) {    if (amount < 0) return -1;    if (amount == 0) return 0;    if (count[amount] != 0) return count[amount];    int min = Integer.MAX_VALUE;    for (int coin : coins) {        int res = coinChange_h(coins, amount - coin,count);        if (res >= 0 )            min = Math.min(1 + res,min);    }    count[amount] = min == Integer.MAX_VALUE ? -1:min;    return  count[amount];}

?解法三:动态规划【自下而上】

?思路:

状态定义:dp[j],凑齐总金额j,需要的最小硬币数。

状态转移方程:dp[i][j]= min(dp[i][j],dp[i](j-coins[i]) + 1)。凑齐总金额j需要的最小硬币数,当地i个硬币选或者不选两种情况。

public int coinChange_2(int[] coins, int amount) {    if (amount < 1) return 0;    int[] dp = new int[amount+1];    Arrays.fill(dp,amount+1);    //这儿解释下为啥默认填充amount+1,凑齐amount最多也就是面值为1的数总计用amount个,    // 所以最少个数一定是    dp[0]=0;    for(int j=1;j<=amount;j++){        for(int num:coins){            if(num <= j){                dp[j]=Math.min(dp[j],dp[j-num]+1);            }        }    }    return dp[amount]==amount+1?-1:dp[amount];}

复杂度分析

  • 时间复杂度:O(SN):这里S是总金额,N是提供的不同面额数,即数组长度。我们要计算O(S)个不同总金额,对每次的总金额需要N个面额来转移状态,一共需要O(SN)的时间复杂度。

  • 空间复杂度:O(S),我们使用了一个S+1的dp数组。


8867c0d412939c151e5d92160a06b8eb.gif不积跬步,无以至千里。

文章有帮助的话,点个转发、在看呗f8edf96e5b4ef7484961171bc0913005.gif

谢谢支持哟 (*^__^*)

END

7b25c7e6ffbe43a94d0b5e9143484c66.gif?7b25c7e6ffbe43a94d0b5e9143484c66.gif

5a5c734e2f3bb91331c91c85186185c8.png

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

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

相关文章

算法与数据结构 (三) 二叉树的简单应用 二叉查找树,二叉堆排序

一 二叉查找树 二叉查找树又叫二叉排序树&#xff0c;是为了解决查找的效率问题。正常情况下查找一个元素&#xff0c;需要O&#xff08;n&#xff09;的代价&#xff0c;但是如果查找元素有顺序&#xff0c;有序数组&#xff1a;可以用二分查找降低到 lgn 代价&#xff0c;但…

java操作Excel的poi 遍历一个工作簿

遍历一个工作簿 package com.java.poi;import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.poifs.…

git 回滚 add 操作_炫技!git 优雅回滚一次错误的合并操作!

点击蓝色小字关注!关注一下你就不会有bug&#xff01;合并操作相对于常规的 commit&#xff0c;当使用 git merge 合并两个分支的时候&#xff0c;你会得到一个新的 merge commit。当我们 git show 的时候会出现类似信息&#xff1a;1commit 6dd0e2b9398ca8cd12bfd1faa1531d86d…

PS教程第十八课:放大缩小

导航器进行放大缩小操作

[Gamma阶段]展示博客

水哥牛X团队[Gamma阶段]展示博客 微信小程序搜索“小小易校园”即可体验 项目愿景 想参加竞赛&#xff0c;锻炼自己&#xff0c;却找不到合适的队友想进行实习&#xff0c;体验工作&#xff0c;每天不得不翻遍吐槽版的几百条信息却一无所获发布在吐槽版的“求组队”被聊天淹没&…

删除sessionstorage_localStorage 和 sessionStorage 介绍

一、 简述sessionStorage 和 sessionStorage 是 HTML5 新增的两个特性&#xff0c;这两个特性主要是用来作为会话存储和本地存储来使用的&#xff0c;解决了 cookie 存储空间不足的问题&#xff1b;sessionStorage 属性允许你访问一个 session Storage 对象&#xff0c;用于存储…

redis springmvc mysql_redis和mysql怎么一起在springmvc里面

展开全部一、mysql集成到springMVC中的方法&#xff1a;1、在SRC目录下创建一个32313133353236313431303231363533e4b893e5b19e31333361323538db-config.properties文件来存放我们的数据源配置信息&#xff1a;db.url jdbc:mysql:///springmvcdb?useUnicodetrue&character…

mysql安装了libaio还是报错_ubuntu安装mysql遇到的坑----解决Mysql报错缺少libaio.so.1

rootmaster:/usr/local/mysql# /usr/local/mysql/bin/mysqld --initialize --usermysql --datadir/usr/local/mysql/data --basedir/usr/local/mysql弹出一个错:/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object f…

Notepad++连接VMWare中Linux只能看到/root目录

如下图&#xff0c;使用SFTP协议连接&#xff0c;用root用户登录后&#xff0c;我一开始只能看到root下的文件。稍作修改&#xff0c;把下面的“Initial remote directory”设置成“/”就可以看到根目录了。 转载于:https://www.cnblogs.com/bigbigbigo/p/11054876.html

创建没有Document的MFC MDI应用程序

程序源代码 效果&#xff0c;如图&#xff1a;1)创建一个MFC MDI应用程序&#xff0c;Wizard设置如图&#xff0c;然后点Finish2)CMyTreeView 在CMyTreeView中新增三个函数&#xff0c;显示些示例数据virtual BOOL PreCreateWindow(CREATESTRUCT& cs);//本例没有使用该函…

glassfish mysql 配置文件_最新glassfish配置mysql

在百度搜了一个下午&#xff0c;都没有搞定glassfish配置mysql&#xff0c;特别是百度文库中的GlassFish中MySQL连接池配置这篇文章&#xff0c;我不知道它是不是过时了&#xff0c;配一个jdbcConnPool就要写一个mysql.xml,那我要再配一个&#xff0c;岂不是再写一个mysql2.xml…

Apollo 无人驾驶平台中多传感器标定

传感器标定是无人车最基础也是最核心的模块之一。作为软件层提供的第一项服务&#xff0c;标定质量和准确度极大地影响着感知、定位地图、PNC 等模块。在 Apollo 开源自动驾驶平台中&#xff0c;我们提供了丰富的多传感器标定服务&#xff0c;如激光雷达、惯导、摄像头、多普勒…

mysql数据库的数据类型转换_MySQL 和Server 2000 数据库中数据类型的转换

问题阐述在某些特殊的时候&#xff0c;可能要将MySQL 数据库转换为SQL Server 2000 数据库&#xff0c;这时问题也就随之而来。例如&#xff0c;在MySQL 数据库中&#xff0c;创建的字段使用varchar 类型&#xff0c;该类型的数据可以进行聚合运算&#xff0c;其返回的值是stri…

【Silverlight】Bing Maps开发应用与技巧二:自定义图钉标注控件和动态ToolPanel

在Bing Maps Silverlight Control中以及为我们提供了地图图钉控件Pushpin&#xff0c;我曾经在《使用图钉层&#xff08;Pushpin layer&#xff09;及地图图层&#xff08;MapLayer&#xff09;》一文中介绍过他的使用方法&#xff0c;本篇主要介绍如何自定义图钉标注控件以及对…

java 创建线程的三种方法_java 创建线程的几种方式

说道线程&#xff0c;肯定会想到使用 java.lang.Thread.java这个类那么创建线程也主要有2种方式第一种方式&#xff1a;public class MyThread extends Thread {public void run() {System.out.println("这是MyThread线程");}}然后在调用处&#xff0c;执行start方法…