DP(5) | 完全背包 | Java | 卡码52, LeetCode 518, 377, 70 做题总结

news2024/12/23 8:41:43

完全背包

感觉越写越糊涂了,初始化怎么做的?递推公式怎么来的?

  • 状态变量
    在这里插入图片描述
  • 初始化 f[0][0] = 0
  • 代码
    这里的 f[i][j] = f[i][j-w[i]],就是和0-1背包最大的不同
for(int i=1; i<=n; i++) { //物品i
  for(int j=1; j<=m; j++) {
    if(j<w[i])  f[i][j] = f[i-1][j];
    else f[i][j] = max(f[i-1][j], f[i][j-w[i]] + c[i]);
  }
}

时间复杂度 O(n*m)
空间复杂度 O(n*m)
  • 一维数组
    在这里插入图片描述
    继续简化代码变为
for(int i=1; i<=n; i++) {
  for(int j=w[i]; j<=m; j++) { ---这里变动
    f[j] = max(f[j], f[j-w[i]] + c[i]);
  }
}
  • 与01背包的区别
    在这里插入图片描述

卡码52. 携带研究材料

https://kamacoder.com/problempage.php?pid=1052

在这里插入图片描述

import java.util.*;

public class Main {
    
    public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int N = sc.nextInt(); //研究材料的种类
       int bagSize = sc.nextInt(); //行李空间 
       
       int[] weight = new int[N];
       int[] value = new int[N];
       for(int i=0; i<N; i++) {
           weight[i] = sc.nextInt();
           value[i] = sc.nextInt();
       }
       
       int[]dp = new int[bagSize+1];
       for(int i=0; i<N; i++) {
           for(int j=weight[i]; j<bagSize+1; j++) {
               dp[j] = Math.max(dp[j], dp[j-weight[i]] + value[i]);
           }
       }
       System.out.println(dp[bagSize]);
    }
}

518. 零钱兑换 II

这道题使用动态规划:当前状态依靠上一状态得到。

  • 初始化出错:dp[0]=1的意思是,amount等于0的时候 凑成总金额0的货币组合数为1
class Solution {
    public int change(int amount, int[] coins) {
        int[]dp = new int[amount+1];
        dp[0] = 1;
        //dp[j]: 总金额为j的时候,有dp[j]种方式找零钱
        //
        int M = coins.length;
        for(int i=0; i<M; i++) {
            for(int j=coins[i]; j<= amount; j++) {
                dp[j] = dp[j] += dp[j-coins[i]];
            }
        }
        return dp[amount];
    }
}
  • 别人的二维数组解法
class Solution {
    public int change(int amount, int[] coins) {
        int n = coins.length;
        int[][] f = new int[n + 1][amount + 1];
        f[0][0] = 1;
        for (int i = 0; i < n; i++) {
            for (int c = 0; c <= amount; c++) {
                if (c < coins[i]) {
                    f[i + 1][c] = f[i][c];
                } else {
                    f[i + 1][c] = f[i][c] + f[i + 1][c - coins[i]];
                }
            }
        }
        return f[n][amount];
    }
}

377. 组合总和 Ⅳ

和518. 零钱兑换 II 的区别:① 求组合(518)先物品后背包 ② 求排列(377)先背包后物品

先物品后背包:先把物品0放进来,然后把物品1放进来,所以我们计算的情况顺序只有(物品0,物品1)的情况,不会出现(物品1,物品0),因此为组合

class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[]dp = new int[target+1];

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

        //递推
        //dp[i][j]表示 从物品0-i任取,满足恰好等于 j ,所有可能的组合有dp[i][j]个
        for(int i=0; i<=target; i++) {
            for(int j=0; j<nums.length; j++){
                if (i >= nums[j]) {
                    dp[i] += dp[i - nums[j]];
                }
            }
        }

        return dp[target];
    }
}

// 完全背包的初始化不太一样
// 0-1背包对首行(当weight[0]<=j的时候,dp[0][j]=value[i])首列进行初始化


70. 爬楼梯 (进阶)

  • 错误:for i=1 for j=1
  • 而且 j<=M ,包含等于
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int bagSize = sc.nextInt();
        int M = sc.nextInt();
        int[] dp = new int [bagSize+1];
        
        dp[0] = 1;
        
        for(int i=1; i<bagSize+1; i++) {
            for(int j=1; j<=M; j++) { //物品
                if(i >= j) {
                    dp[i] += dp[i-j]; 
                }
            }
        }
        System.out.println(dp[bagSize]);
    }
}

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

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

相关文章

Kotlin中Unit、Any和Nothing

Unit Unit是一个特殊的类型&#xff0c;它表示“没有意义的值”的单元类型。在Kotlin中&#xff0c;当你不需要函数返回任何具体值时&#xff0c;可以使用Unit类型。 和Java 中 void一样。 Any 所有非空类的父类 Any?所有类的父类 类似Java中Object Nothing 表示一个函数或…

python的日期和时间

时间与日期 基础知识&#xff08;python的时间表示方法&#xff09; 时间戳 时间戳是一个用于表示特定时间点的方式&#xff0c;它表示自1970年1月1日00:00:00 UTC&#xff08;协调世界时&#xff09;以来经过的秒数。时间戳通常用于编程中&#xff0c;因为它提供了一种简单的方…

运维-Docker-黑马

运维-Docker-黑马 编辑时间&#xff1a;2024/7/15 来源&#xff1a;黑马程序员 docker&#xff1a;快速构建&#xff0c;运行&#xff0c;管理应用的工具 Docker安装 部署mysql 命令解读

【JavaScript 算法】贪心算法:局部最优解的构建

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、贪心算法的基本概念贪心算法的适用场景 二、经典问题及其 JavaScript 实现1. 零钱兑换问题2. 活动选择问题3. 分配问题 三、贪心算法的应用四、总结 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种逐步构建解…

ReAct 大模型提示框架

你可能不熟悉 ReAct&#xff0c;这是一个旨在增强语言模型 (LLM) 决策能力的尖端框架。 通过使用新的观察结果更新 LLM 的上下文窗口并提示其重新评估信息&#xff0c;ReAct 促进了类似于人类思维过程的推理水平&#xff0c;超越了诸如思维链提示之类的旧技术。 在本文中&…

RocketMQ~架构与工作流程了解

简介 RocketMQ 具有高性能、高可靠、高实时、分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统&#xff0c;由阿里巴巴团队开发&#xff0c;在 2016 年底贡献给 Apache&#xff0c;成为了 Apache 的一个顶级项目。 在阿里内部&#xff0c;RocketMQ 很好地服务了集…

C++笔试强训4

文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 %o就是输出八进制的无符号数&#xff0c;0123&#xff0c;&#xff0c;以0开头&#xff0c;本来就是八进制&#xff0c;所以输出为123&#xff0c;123是十进制&#xff0c;转化为八进制就是173. 故选…

Python实现基于http通信的protobuf数据传输的案例,包括请求者和接收者

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

tensorflow1基础函数学习

学习准备&#xff1a; 所需的库&#xff1a; tensorflow 1.12.0 numpy 1.19.5基本初始化函数 1.1 理解张量 tensor&#xff1a; 多维数组&#xff08;列表&#xff09;&#xff0c; 阶&#xff1a;张量的维数 维数名字栗子0标量s 1, 2, 31向量v [1, 2, 3]2矩阵m [[1, …

uniapp 微信默认地图选点功能实现

效果图 配置项 微信公众平台-小程序配置 uniapp配置 上代码 <template><view class"content"><button click"toMap">请选择位置</button></view> </template><script setup lang"ts">function toMa…

Qt Style Sheets-使用样式表自定义 Qt 部件

使用样式表自定义 Qt 部件 在使用样式表时&#xff0c;每个小部件都被视为具有四个同心矩形的框&#xff1a;边距矩形、边框矩形、填充矩形和内容矩形。框模型对此进行了更详细的描述。 盒模型 以下是四个同心矩形在概念上的呈现方式&#xff1a; 边距超出边框。边框绘制在边…

【源码剖析】ThreadLocal 源码剖析

源码类注释 /*** This class provides thread-local variables. These variables differ from* their normal counterparts in that each thread that accesses one (via its* {code get} or {code set} method) has its own, independently initialized* copy of the variab…

鼠标录制工具怎么挑选?9款电脑鼠标录制工具分享(2024)

你知道鼠标录制工具吗&#xff1f;鼠标录制工具通过记录和回放用户的操作&#xff0c;帮助自动化重复性任务&#xff0c;提高工作效率和精确性。它可以帮助用户简化很多繁琐的操作步骤&#xff0c;非常适合运用在电脑自动化任务、游戏自动化中&#xff0c;给大家整理了2024年9款…

使用assembly插件来将外部文件夹打进jar包

目录&#xff1a; 1、pom文件的配置2、新建assembly的描述文件3、maven打包 1、pom文件的配置 <!--maven构建--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</ar…

代理模式(静态代理,动态代理,cglib代理)

文章目录 代理模式代理模式的角色静态代理案例代码抽象父类接口目标对象代理对象客户端使用输出结果 动态代理案例代码抽象父类与实现类代理工厂客户端 cglib代理引入依赖目标对象代理工厂客户端 代理模式 代理模式属于结构型的模式&#xff0c;通过代理对象来访问目标对象&am…

malloc底层实现

xv6实现的动态内存分配虽然只有不到100行代码&#xff0c;但却体现了动态内存分配的精髓&#xff0c;非常值得学习 xv6的内存布局 一谈到C语言的动态内存分配&#xff0c;就会想到堆以及malloc()和free()这两个函数。先来回顾一下XV6中的内存布局是怎样的&#xff0c;我们动态…

FPGA实训报告DAY 1(Verilog HDL)

实习日志与总结 日期&#xff1a;2024 年 7 月 10 日 星期三 姓名&#xff1a;XXX 一、实习日志 上午 9:00 - 9:30 按时到达工位&#xff0c;参加部门早会&#xff0c;了解了今天的实习任务和目标&#xff0c;即初步学习 FPGA 简介和 Verilog 基础语法知识。 9:30 - 10:30…

数据结构(5.2_1)——二叉树的基本定义和术语

二叉树的基本概念 二叉树是n(n>0)个结点的有限集合: 或者为空二叉树&#xff0c;即n0&#xff1b;或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一颗二叉树。 特点:每个结点至多只有两颗字数&#xff1b;左子树不能颠倒(二叉树…

2024牛客暑期多校第一场

H 一开始以为考后缀和&#xff0c;耽误了一会。后面直接看样例猜结论&#xff0c;数字乘位置为对答案的贡献 #include<bits/stdc.h>using namespace std;#define int long long #define PII pair<int,int>const int M1000000007;void solve() {int n;cin>>…