D3839|完全背包

完全背包:

首先01背包的滚动数组中的解法是内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。

for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = bagWeight; j >= weight[i]; j--) { // 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
    }
}

而完全背包的物品是可以添加多次的,所以要从小到大去遍历,即:

// 先遍历物品,再遍历背包
for(int i = 0; i < weight.size(); i++) { // 遍历物品
    for(int j = weight[i]; j <= bagWeight ; j++) { // 遍历背包容量
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

    }
}

 同时找到规律,如果存在后序遍历(比如01背包的滚动数组)的话,两个for循环的顺序就不可以变,但如果都是正序的话,两个for循环的顺序就可以进行改变。


518.零钱兑换||

题解复盘:

1)dp数组的含义:dp[j]:凑成总金额j的货币组合数为dp[j]

2)数组的递推公式:dp[j] += dp[j - coins[i]];

3)初始化:

 dp[0] = 1 ;

下标非0的dp[j]初始化为0,dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。

4)确定遍历顺序:

所以纯完全背包是能凑成总和就行,不用管怎么凑的。

本题是求凑出来的方案个数,且每个方案个数是为组合数。

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

5)举例推导dp数组

大概的数字变化情况,coins[1]的dp[2] = coins[0]那排的dp[2] + coins[1]的dp[0],不选coins[1]的方法数加上选coins[1]的方法数.

class Solution {
    public int change(int amount, int[] coins) {
        int[] dp = new int[amount+1];
        dp[0] = 1;
        for(int i = 0;i<coins.length;i++){
            for(int j=coins[i];j<amount+1;j++ ){
                if(j-coins[i]<0){
                    dp[j] = dp[j];
                }else{
                    dp[j] = dp[j]+dp[j-coins[i]];
                }
            }
        }
        return dp[amount];
    }
}

377.组合总和IV

        这道题相较于上一道感觉是由求组合数变为了求排列数。

class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target+1];
        Arrays.sort(nums);
        if(nums[0]<target){
            dp[0] = 1;
        }else{
            dp[0] = 0;
        }
        for(int i = nums[0];i<target+1;i++){
            for(int j = 0;j<nums.length;j++){
                if(i-nums[j]>=0){
                    dp[i] = dp[i]+dp[i-nums[j]];
                }else{
                    dp[i] = dp[i];
                }
            }
        }
        return dp[target];

    }
}

70. 爬楼梯(进阶版) 

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 

每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢? 

注意:给定 n 是一个正整数

初始思路:

        之前的爬楼梯每次爬1,2个台阶,dp(3)  = dp(1)+dp(2)

        由此推断每次爬1 <= m,dp(m+1) = dp(m)+dp(m-1)+...+dp(1)

分析动态规划五部曲:

(1)dp数组的含义:dp[j] 爬j阶台阶的方法数。

(2)dp的递推公式:

dp[n] = dp[n-m]+dp[n-m+1]+...+dp[n-1];

  (3) 初始化:

        dp[1] = 1;

        dp[2] = 2;

        dp[3] = dp[2]+dp[1]+1;

        dp[4] = dp[3]+dp[2]+dp[1]+1;

dp[0] = 1;

dp[1] = dp[1]+dp[0];

dp[2] = dp[2]+dp[1]+dp[0];

(4)循环方式,先背包容量再物品,这样每一个容量都可以遍历一次所需要的物品

(5)举例:

import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static int climbStairs(int n, int m) {
        int[] dp = new int[n + 1];
        Arrays.fill(dp, 0);
        dp[0] = 1;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (i - j >= 0) {
                    dp[i] += dp[i - j];
                }
            }
        }
        return dp[n];
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        System.out.println(climbStairs(n, m));
    }
}

可以理解题解,但是卡码网会超时不知道为什么。


322. 零钱兑换

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

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

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

初始思路&&题解复盘:

        感觉是在完全背包的基础上变为了最少的硬币个数。之前是由小数开始遍历,如果要是最少的硬币个数感觉从大数开始遍历比较好?

动态规划五部曲:

1.dp数组的定义

       dp[j]组成j元所需要的最少硬币数

2.递归数组

       dp[j] = Math.min(dp[j],dp[j-coins[i]]+1)

3.初始化(这里没想到)

       dp[0] = 0;

        dp[i] = MAX_VALUE;

4.遍历顺序

       考虑到组合问题,所以先循环物品,再循环背包

        只有dp[j-coins[i]]不是初始最大值时,该位才有选择的必要

       //只有dp[j-coins[i]]不是初始最大值时,该位才有选择的必要
                if (dp[j - coins[i]] != max) {
                    //选择硬币数目最小的情况
                    dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
                }

5.推导

所以这道题目非常关键的地方一个是注意初始化,一个是只有满足条件时,该位的数值才发生更新。


279.完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

初始思路:

由题意可知,这道题需要我们自己构建coins数组,如果这个数小于16,那么我们的数组就只需要装1,4,9,剩下的步骤同上一题一样,注意处理一些较少数目的特殊情况。

class Solution {
    public int numSquares(int amount) {
        if(amount<4){return amount;}
        int n = 0;
        for(int i = 0;i<amount;i++){
            if(i*i>amount){
                n=i-1;
                break;
            }

        }
        int[] coins = new int[n];
        for(int i = 0;i<coins.length;i++){
            coins[i] = (i+1)*(i+1);
        }
        int[] dp = new int[amount+1];
        dp[0] = 0;
        for(int i = 1;i<amount+1;i++){
            dp[i] = Integer.MAX_VALUE;
        }
        for(int i = 0;i<coins.length;i++){
            for(int j = coins[i];j<amount+1;j++){
                dp[j] = Math.min(dp[j],dp[j-coins[i]]+1);
            }
        }
        //System.out.println(Arrays.toString(dp));
        return dp[amount];
        
    }
}

题解复盘:

class Solution {
    // 版本一,先遍历物品, 再遍历背包
    public int numSquares(int n) {
        int max = Integer.MAX_VALUE;
        int[] dp = new int[n + 1];
        //初始化
        for (int j = 0; j <= n; j++) {
            dp[j] = max;
        }
	//如果不想要寫for-loop填充數組的話,也可以用JAVA內建的Arrays.fill()函數。
	//Arrays.fill(dp, Integer.MAX_VALUE);
	
        //当和为0时,组合的个数为0
        dp[0] = 0;
        // 遍历物品
        for (int i = 1; i * i <= n; i++) {
            // 遍历背包
            for (int j = i * i; j <= n; j++) {
                //if (dp[j - i * i] != max) {
                    dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
                //}
		//不需要這個if statement,因爲在完全平方數這一題不會有"湊不成"的狀況發生( 一定可以用"1"來組成任何一個n),故comment掉這個if statement。
            }
        }
        return dp[n];
    }
}

一个完美的递推公式:dp[j] = Math.min(dp[j], dp[j - i * i] + 1)

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

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

相关文章

连接服务器出现内部错误的原因与解决方案

服务器作为重要的数据存储和处理中心&#xff0c;其稳定性和可靠性对于企业和个人的业务运营至关重要。然而&#xff0c;在实际应用中&#xff0c;我们经常会遇到连接服务器时出现内部错误的情况。根据用户反馈显示&#xff0c;远程桌面出现内部错误的问题由来已久&#xff0c;…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(一)

社会工程学—世界头号黑客凯文米特尼克在《欺骗的艺术》中曾提到&#xff0c;这是一种通过对受害者心理弱点、本能反应、好奇心、信任、贪婪等心理陷阱进行诸如欺骗、伤害等危害手段。 SET最常用的攻击方法有&#xff1a;用恶意附件对目标进行 E-mail 钓鱼攻击、Java Applet攻…

xp的viostor驱动无法获取磁盘序列号的分析

深信服的viostor驱动在获取序列号的时候&#xff0c;多了一个IDE处理的代码&#xff0c;位置在1128处。它会在刚开机加载viostor.sys时机被调用&#xff0c;然后去读取注册表HKLM\\SYSTEM\CurrentControlSet\Services\viostor\Parameters的IDESNCompat&#xff0c;若为1则有此功…

第十四节TypeScript 联合类型

1、简介 联合类型可以通过管道&#xff08;|&#xff09;将变量设置多种类型&#xff0c;赋值时可以根据设置的类型来赋值。 注意&#xff1a;只能赋值指定的类型&#xff0c;如果赋值其它类型就会报错的。 2、创建联合类型的语法格式&#xff1a; Type1|Type2|Type3 实例&a…

【PostGIS】PostgreSQL15+对应PostGIS安装教程及空间数据可视化

一、PostgreSQL15与对应PostGIS安装 PostgreSQL15安装&#xff1a;下载地址PostGIS安装&#xff1a;下载地址&#xff08;选择倒数第二个&#xff09; 1、PostgreSQL安装 下载安装包&#xff1b;开始安装&#xff0c;这里使用默认安装&#xff0c;一直next直到安装完成&…

小狐狸ChatGPT系统 不同老版本升级至新版数据库结构同步教程

最新版2.6.7下载&#xff1a;https://download.csdn.net/download/mo3408/88656497 小狐狸GPT付费体验系统如何升级&#xff0c;该系统更新比较频繁&#xff0c;也造成了特别有用户数据情况下升级时麻烦&#xff0c;特别针对会员关心的问题出一篇操作教程&#xff0c;本次教程…

WT2605C高品质音频蓝牙语音芯片:外接功放实现双声道DAC输出的优势

在音频处理领域&#xff0c;双声道DAC输出能够提供更为清晰、逼真的音效&#xff0c;增强用户的听觉体验。针对这一需求&#xff0c;唯创知音的WT2605C高品质音频蓝牙语音芯片&#xff0c;通过外接功放实现双声道DAC输出&#xff0c;展现出独特的应用优势。 一、高品质音频处理…

Java 并发编程(八)-异步编程-CompletableFuture

目录 一、异步编程 1、CompletableFuture应用 1.1、CompletableFuture介绍 1.2、CompletableFuture应用 1.2.1、supplyAsync 1.2.2、runAsync 1.2.3、thenApply&#xff0c;thenApplyAsync 1.2.4、thenAccept&#xff0c;thenAcceptAsync 1.2.5、thenRun&#xff0c;t…

原来电脑并不需要重装系统才能恢复出厂设置,这个操作学起来!

前言 小伙伴们应该都知道手机上有恢复出厂设置的功能&#xff0c;如果想要把手机送给朋友或者卖给别人&#xff0c;就会先恢复出厂设置。 但换到Windows电脑上之后&#xff0c;如果出现同样的情况&#xff0c;就会第一时间想到重装系统。就好像Windows电脑上不存在恢复出厂设…

【教学类-42-01】20231224 X-Y 之间加法题判断题1.0(加法是否正确,写出正确答案)

作品展示&#xff1a; 背景需求&#xff1a; 很多大班孩子很熟练做“0-5&#xff0c;0-10的加法、或减法题目&#xff0c;需要新的题型来换花样。除了”比大小“&#xff0c;我能想起的就是”判断加法题答案是否正确。 WORD模板 代码展示&#xff1a; X-Y 之间的所有加法题的…

Pytorch项目(模型训练与优化),肺癌检测项目之六

数据优化方案 数据优化方案1&#xff1a;重复抽样 &#xff08;1&#xff09;对多数类的样本实施欠采样&#xff0c;减少多数类数量 &#xff08;2&#xff09;对少数类的样本实施过采样&#xff0c;增加少数类数量 数据优化方案2&#xff1a;数据增强 数据增强&#xff08…

IntelliJ IDEA 2023.3 最新版如何如何配置?IntelliJ IDEA 2023.3 最新版试用方法

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Vue 在同一个项目中,判断pc端和移动端,显示不同风格的页面(附pc端移动端显示效果图)

实现思路 1、修改index.html页面的meta 2、增加pc端移动端的判断 3、设置路由&#xff0c;根据不同的端&#xff0c;调用各自的路由&#xff0c;显示不同的页面 index.html 修改如下 <meta name"viewport" content"widthdevice-width,initial-scale1.0,minim…

智能算法(GA、DBO等)求解阻塞流水车间调度问题(BFSP)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

[VScode]Jupyter自动生成目录

用到插件Jupyter TOC 插件主页有一张动图介绍这个功能怎么用&#xff1a; 点击标签页面&#xff0c;右上角3个点那个位置&#xff0c;不是正文里单元格的右上角&#xff1b; 选Generate table of contents就可以自动生成目录 VScode 还有好多好多功能等待你发现呢&#xff0…

大数据深度学习朴素贝叶斯深度解码:从原理到深度学习应用

大数据深度学习朴素贝叶斯深度解码&#xff1a;从原理到深度学习应用 文章目录 大数据深度学习朴素贝叶斯深度解码&#xff1a;从原理到深度学习应用一、简介贝叶斯定理的历史和重要性定义例子 朴素贝叶斯分类器的应用场景定义例子常见应用场景 二、贝叶斯定理基础条件概率定义…

Java研学-HTTP 协议

一 概述 1 概念和作用 概念&#xff1a;HTTP 是 HyperText Transfer Protocol (超文本传输协议)的简写&#xff0c;它是 TCP/IP 协议之上的一个应用层协议。简单理解就是 HTTP 协议底层是对 TCP/IP 协议的封装。   作用&#xff1a;用于规定浏览器和服务器之间数据传输的格式…

人工智能轨道交通行业周刊-第69期(2023.12.11-12.24)

本期关键词&#xff1a;集装箱智能管理、智慧工地、智能应急机器人、车辆构造、大模型推理 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨…

安洵杯 re + 其他部分题解

第11&#xff0c;比较小丑&#xff0c;差了一步队伍wp应该会发吧&#xff0c;不知道&#xff0c;我先放点跟我有关系的 Re mobilego so的check看了一会比较南崩&#xff0c;但是看flag的密文形式很像简单位置替换所以直接输编码表&#xff0c;jeb动调然后得到替换表解密就行…

[c]扫雷

题目描述 扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。 玩家翻开一个非地雷格时&#xff0c;该格将会出现一个数字——提示周围格子中…