代码随想录算法训练营第四十四天 _ 动态规划_完全背包问题、518.零钱兑换II、377.组合总和IV。

学习目标:

动态规划五部曲:
① 确定dp[i]的含义
② 求递推公式
③ dp数组如何初始化
④ 确定遍历顺序
⑤ 打印递归数组 ---- 调试
引用自代码随想录!

60天训练营打卡计划!

学习内容:

完全背包问题 – 二维dp数组

  • 动态规划五步曲:
    ① 确定dp[i][j]的含义 : 任取[0, i]的物品(可重复使用)后放进容量为j的背包 所能放的 最大价值
    ② 求递推公式 : dp[i][j] = Math.max(dp[i-1][j], dp[i][j-weight[i]] + value[i]);
    Ⅰ 不放物品 i : dp[i][j] = dp[i-1][j];
    Ⅱ 放物品 i : dp[i][j-weight[i]] + value[i] 依赖本行已填充的值
    ③ dp数组如何初始化 : 对第一行进行单独的初始化,如下图所示。当背包容量大于第一个物品的重量时开始放入背包,一直连续放入。
    ④ 遍历顺序:先遍历物品,再遍历背包,和01背包问题一致。

下面的代码应该是没问题的,但是数字量变大之后会很容易超时。在这里插入图片描述

// 动态规划
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //m,n分别代表物品种类和背包容量
        int itemSize = 0,bagSize = 0;
        Scanner sc = new Scanner(System.in);
        //获取itemSize和bagSize的值
        itemSize = sc.nextInt();
        bagSize = sc.nextInt();
        //初始化对应的重量数组和价值数组
        int[] weight = new int[itemSize];
        int[] value = new int[itemSize];
        //这两个都是物品的属性,大小只和物品数量有关
        for(int i = 0;i < itemSize;i++){
            weight[i] = sc.nextInt();
            value[i] = sc.nextInt();
        }
        
        // 完全背包问题
        testWeightBagProblem(weight,value,bagSize);
    }

    /**
     * 动态规划获得结果
     * @param weight  物品的重量
     * @param value   物品的价值
     * @param bagSize 背包的容量
     */
    public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){

        int itemSize = weight.length;
        // dp数组的含义是:在[0,i]件物品中选择是否放入背包 的 最大价值
        int[][] dp = new int[itemSize][bagSize+1];
        
        int val = 0;
        
        // 初始化dp数组,默认都为0.
        // 使用最小重量的物品为该物品所在行赋值
        for(int j = weight[0]; j < bagSize+1; j++){
            if(j % weight[0] == 0)  val += value[0];
            dp[0][j] = val;
        }
        
        // 正常的为dp数组赋值,依赖左上位置的其他的dp值
        for(int i = 1; i < itemSize; i++){
            // j是背包容量
            for(int j = 1; j < bagSize+1; j++){
                // 如果容量可以放入新的物品,则从本行的左侧继承
                if(j >= weight[i]){
                    // 一定要填j < weight[i]的位置,
                    // dp[i][j-weight[i]]与该行左侧的值息息相关。
                    dp[i][j] = Math.max(dp[i-1][j], dp[i][j-weight[i]] + value[i]);
                }
                // 如果容量不够放入新的物品,则从上一行继承
                else if(j < weight[i])   dp[i][j] = dp[i-1][j];
            }
        }
        System.out.println(dp[itemSize-1][bagSize]);
        
        // 打印dp数组
        for (int i = 0; i < itemSize; i++) {
            for (int j = 0; j <= bagSize; j++) {
                System.out.print(dp[i][j] + "\t");
            }
            System.out.println("\n");
        }
    }
}

完全背包问题 – 一维dp数组

  • 动态规划五步曲:
    ① 确定dp[j]的含义 : 任取[0, i]的物品(可重复使用)后放进容量为j的背包 所能放的 最大价值
    ② 求递推公式 : dp[j] = Math.max(dp[j], dp[j-weight[i]] + value[i]);
    Ⅰ 不放物品 i : dp[j]
    Ⅱ 放物品 i : dp[j-weight[i]] + value[i]
    ③ dp数组如何初始化 : 初始化为0
    ④ 遍历顺序:先遍历物品,再遍历背包(正序),和01背包问题8同。

虽然下面的代码应该是没问题的,但是数字量变大之后会很容易超时。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //m,n分别代表物品种类和背包容量
        int itemSize = 0,bagSize = 0;
        Scanner sc = new Scanner(System.in);
        //获取itemSize和bagSize的值
        itemSize = sc.nextInt();
        bagSize = sc.nextInt();
        //初始化对应的重量数组和价值数组
        int[] weight = new int[itemSize];
        int[] value = new int[itemSize];
        //这两个都是物品的属性,大小只和物品数量有关
        for(int i = 0;i < itemSize;i++){
            weight[i] = sc.nextInt();
            value[i] = sc.nextInt();
        }
        
        // 完全背包问题
        testWeightBagProblem(weight,value,bagSize);
    }

    /**
     * 动态规划获得结果
     * @param weight  物品的重量
     * @param value   物品的价值
     * @param bagSize 背包的容量
     */
    public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){

        int itemSize = value.length;
        int[] dp = new int[bagSize+1];
        
        // 初始化为0
        
        // 递归推导
        for(int i = 0; i < itemSize; i++){
            for(int j = weight[i]; j < bagSize+1; j++){
                dp[j] = Math.max(dp[j], dp[j-weight[i]] + value[i]);
                // System.out.print(dp[j] + "\t");
            }
            // System.out.println("\n");
        }
        
        System.out.print(dp[bagSize] + "\n");

    }
}

518.零钱兑换II

  • 动态规划五步曲:
    ① 确定dp[i]的含义 : 装满容量为i的背包有dp[i]种方法。
    ② 求递推公式 : dp[j] += dp[j - coins[i]] (装满背包的方法数的相关问题的统一递归公式)
    ③ dp数组如何初始化 : dp[0] = 1 (若dp[0] = 0,则所有的全部为0。)
    ④ 确定遍历顺序 : 从前向后,先物品后背包
    ⑤ 打印dp数组
组合的dp数组
1 1 1 1 1
1 2 2 3 3
1 2 2 3 4

排列的dp数组
1 1 1
1 1 1
1 2 2
2 3 3
3 5 5
5 8 9
  • 一种记忆方法:先遍历物品(物品不会重复被取得)为组合
class Solution {
    public int change(int amount, int[] coins) {
        int[] dp = new int[amount+1];
        int itemSize = coins.length;

        // 初始化
        dp[0] = 1;

        // 递归推导
        for(int i = 0; i < itemSize; i++){
            // 先物品后背包就可以保证是组合而不是排列
            for(int j = coins[i]; j < amount+1; j++){
                // 因为减去coins[i]的面值,就是可以凑出的方法数。
                dp[j] += dp[j - coins[i]];
                System.out.println(dp[j]);
            }
            System.out.println("*");
        }

        // for(int j = 0; j < amount+1; j++){
        //     // 先背包后物品就可以保证是排列而不是组合
        //     // for(int j = i; j < amount+1; j++){
        //     for(int i = 0; i < itemSize; i++){
        //         // 因为减去coins[i]的面值,就是可以凑出的方法数。
        //         if(j - coins[i] >= 0)
        //             dp[j] += dp[j - coins[i]];
        //         System.out.println(dp[j]);
        //     }
        //     System.out.println("*");
        // }

        return dp[amount];
    }
}

377.组合总和IV

  • 动态规划五步曲:
    ① 确定dp[i]的含义 : 装满容量为i的背包有dp[i]种方法(排列)。
    ② 求递推公式 : dp[j] += dp[j - coins[i]] (装满背包的方法数的相关问题的统一递归公式)
    ③ dp数组如何初始化 : dp[0] = 1 (若dp[0] = 0,则所有的全部为0。)
    ④ 确定遍历顺序 : 从前向后,先背包后物品
    ⑤ 打印dp数组
class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp = new int[target+1];
        int itemSize = nums.length;
        Arrays.sort(nums);

        // 初始化
        dp[0] = 1;

        // 递归推导
        for(int j = 0; j < target+1; j++){
            // 先背包后物品就可以保证是排列而不是组合
            for(int i = 0; i < itemSize && j >= nums[i] ; i++){
                // 因为减去coins[i]的面值,就是可以凑出的方法数。
                dp[j] += dp[j - nums[i]];
                // System.out.println(dp[j]);
            }
            // System.out.println("*");
        }

        return dp[target];
    }
}

学习时间:

  • 上午两个半小时,整理文档半小时。

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

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

相关文章

nvm 的使用 nvm 可以快速的切换 nodejs 的版本

nvm 是什么&#xff1f; nvm 是一个 node 的版本管理工具&#xff0c;可以简单操作 node 版本的切换、安装、查看。。。等等&#xff0c;与 npm 不同的是&#xff0c;npm 是依赖包的管理工具。 nvm 下载安装 安装之前需要先把 自己电脑上边的 node 给卸载了!!!! 很重要 下载地…

基于Java SSM框架实现个性化影片推荐系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现个性化影片推荐系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;个性化影片推荐系统当然也不能排除在外。个性化影片推荐系统是以实际运用…

【MySQL】:表的约束(上)

表的约束 一.非空约束二.default约束三.列描述四.zerofill五.主键1.单个主键2.复合主键 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。比如有…

HCIA-WLAN V3.0,那些重点要点

一、WLAN各个标准&#xff0c;工作频段&#xff0c;理论速率。 二、OFDM和OFDMA&#xff0c;工作频段&#xff0c;空间流。 三、三种帧类型&#xff1a;管理帧、控制帧、数据帧&#xff0c;CAPWAP报文和端口。 四、帧间间隔&#xff0c;波束成形&#xff0c;信道绑定&#xff0…

【obs】官方最强插件obs-websocket入门

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ obs-websocket简介OBS版本说明obs-websocket版本说明安装&#xff08;27.x版本OBS&#xff09;配置插件 2️⃣ OBS-web介绍特征使用方法-5.xhttp vs https 3️⃣ obs-websocket-js开发tester.html 4️⃣ 其它开源项目obs-stud…

QML中Image动态显示图片内容

1.定义一个ColorImageProvider类 #ifndef COLORIMAGEPROVIDER_H #define COLORIMAGEPROVIDER_H#include <QObject> #include <QImage> #include <QQuickImageProvider>#include <QTimer>class ColorImageProvider :public QObject, public QQuickImag…

线上品牌展厅:打造数字品牌形象,助力品牌宣传

引言&#xff1a; 在数字化时代&#xff0c;随着互联网的普及和电子商务的发展&#xff0c;线上品牌展厅成为越来越多品牌关注的焦点。 一&#xff0e;什么是线上品牌展厅 1.线上品牌展厅的定义 线上品牌展厅是指通过互联网或移动应用程序等在线平台&#xff0c;展示品牌产品…

如何用postman进行http接口测试?

HTTP的接口测试工具有很多&#xff0c;可以进行http请求的方式也有很多&#xff0c;但是可以直接拿来就用&#xff0c;而且功能还支持的不错的&#xff0c;我使用过的来讲&#xff0c;还是postman比较上手。 优点&#xff1a; 1、支持用例管理 2、支持get、post、文件上传、…

python 安装对应版本的lxml

安装对应版本的lxml 先把对应版本的lxml文件下载下来&#xff0c;接着在文件夹路径输入cmd回车&#xff0c;用下面命令安装。

java设计模式-工厂方法模式

1.工厂方法(FactoryMethod)模式的定义 定义一个创建产品对象的工厂接口&#xff0c;将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 2.工厂方法模式的主要优缺点 优点&#xff1a; 用户只需要知道具体工厂的名称…

数字海洋贸易:跨境电商的无边界冒险

数字时代的到来让商业舞台向全球开放&#xff0c;而跨境电商作为数字海洋中的一艘船&#xff0c;正在进行一场无边界的冒险。本文将深入探讨数字海洋贸易的概念&#xff0c;分析跨境电商在这个无边界环境中面临的挑战与机遇&#xff0c;以及如何在这个冒险中实现可持续的成功。…

【Java系列】详解多线程(二)——Thread类及常见方法(上篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一…

Git命令大全:从基础到高级应用

目录 一、增加/删除文件 1.1 添加文件到暂存区 1.2 添加所有文件到暂存区 1.3 从暂存区移除文件 1.4 从版本库和工作区删除文件 二、代码提交 2.1 提交暂存区文件到本地仓库 2.2 修改最后一次提交信息 三、本地分支 3.1 创建新分支 3.2 切换分支 3.3 创建并切换到新分支 3.4 删…

4G工业路由器物联网解决方案智慧储能系统

储能系统是用于电网和用户间起到电力缓冲和削峰填谷作用的电力管理平台。储能系统通常由电池、充电机、控制器、电能质量治理装置及监控系统组成。主要应用于可再生能源发电系统&#xff0c;电力需求侧响应&#xff0c;电动汽车充电等领域。 4G工业路由器是一款专门针对物联网…

Leetcode 46 全排列

题意理解&#xff1a; 首先明确全排列是什么&#xff1f; 使用集合里所有的元素&#xff0c;使用不同的顺序进行排列&#xff0c;所有的排列集合即为全排列。 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 这里的元素不会…

python程序编程代码大全,python编程代码详解

这篇文章主要介绍了python语言的代码书写规则有哪些&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 Python代码主要由&#xff1a;5个部分组成&#xff0c;下面就分别介绍&…

子目录文件夹图片汇总

import os import shutildef collect_images(source_folder, target_folder):# 遍历主文件夹及其所有子文件夹for root, dirs, files in

【论文精读ICCV_2023】BlendFace: Re-designing Identity Encoders for Face-Swapping

【论文精读ICCV_2023】BlendFace: Re-designing Identity Encoders for Face-Swapping 一、前言Abstract1. Introduction2. Related Work3. Attribute Bias in Face Recognition Models3.1. Identity Distance Loss3.2. Analysis of Identity Similarity 4. BlendFace4.1. Pre-…

linux下sys目录与proc目录的作用

sys目录作用 在Linux系统中&#xff0c;/sys目录是一个特殊的虚拟文件系统&#xff08;sysfs&#xff09;&#xff0c;用于提供对内核和设备的运行时信息的访问。它是在内核中运行的驱动程序和子系统的接口&#xff0c;可以用于获取和配置系统的硬件和内核信息。 以下是/sys目…

uniapp原生插件之安卓虹软人脸识别增值版原生插件

插件介绍 虹软人脸识别增值版支持在线激活&#xff0c;离线激活&#xff0c;支持图片人脸识别&#xff08;可识别网络图片&#xff09;&#xff0c;活体检测&#xff0c;离线识别&#xff0c;相机预览旋转&#xff0c;相机人脸识别&#xff0c;批量注册&#xff08;支持网络图…