首页 > 编程语言 >算法笔记|Day32动态规划V

算法笔记|Day32动态规划V

时间:2024-08-22 10:22:48浏览次数:10  
标签:凑成 背包 题目 int Day32 笔记 算法 遍历 dp

算法笔记|Day32动态规划V

※※※※※完全背包问题理论

基本题目描述

有n件物品和一个最多能背重量为w的背包,第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品可以无限次使用,求解将哪些物品装入背包里物品价值总和最大。

题目分析

采用一维数组(滚动数组)

1.dp数组含义:j表示背包容量,dp[j]表示容量为j的背包最大的价值总和;
2.递推公式:dp[j]=Math.max(dp[j],[j-weight[i]]+value[i])(j>=weight[i])(如果能装下这个物品,若不放物品i:dp[j]不变化;若放物品i:由dp[j-weight[i]]推出,dp[j-weight[i]]为背包容量为j-weight[i]的时候的最大价值,那么dp[j-weight[i]]+value[i],就是背包放物品i得到的最大价值);
3.初始化:dp[0]=0(背包容量j为0,背包价值总和一定为0);
4.遍历顺序:基本的完全背包题目先遍历物品或背包均可以(应用类题目具体顺序与题意有关),背包容量一定是要正序遍历。

☆☆☆☆☆leetcode 518.零钱兑换II

题目链接:leetcode 518.零钱兑换II

题目分析

1.dp数组含义:dp[j]表示凑成总金额为j的货币组合数;
2.递推公式:dp[j]+=dp[j-coins[i]]
(以dp[j]其中j为5举例,要想凑成总金额为5的货币,要考虑以下情况:
已经有一个1(coins[i])的话,有dp[4]种方法凑成总金额为5的货币
已经有一个2(coins[i])的话,有dp[3]种方法凑成总金额为5的货币
已经有一个3(coins[i])的话,有dp[2]种方法凑成总金额为5的货币
已经有一个4(coins[i])的话,有dp[1]种方法凑成总金额为5的货币
已经有一个5(coins[i])的话,有dp[0]种方法凑成总金额为5的货币
那么凑整dp[5]的总方法数也就是把所有的dp[j - coins[i]]累加起来);
3.初始化:dp[0]=1;(考虑把容量为0也当做一种方法,这样可以递推得到其他结果。若dp[0]是0,递推结果将都是0)
4.遍历顺序:不涉及顺序(组合问题),先遍历货币嵌套遍历背包,背包一定是要正序遍历。

代码

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;j++)
                dp[j]+=dp[j-coins[i]];
        }
        return dp[amount];
    }
}

☆☆☆☆☆leetcode 377. 组合总和Ⅳ

题目链接:leetcode 377. 组合总和Ⅳ

题目分析

1.dp数组含义:dp[j]表示凑成目标正整数为i的排列个数;
2.递推公式:dp[j]+=dp[j-nums[i]]
(以dp[j]其中j为5举例,要想凑成总和为5,要考虑以下情况:
已经有一个1(nums[i])的话,有dp[4]种方法凑成总和为5
已经有一个2(nums[i])的话,有dp[3]种方法凑成总和为5
已经有一个3(nums[i])的话,有dp[2]种方法凑成总和为5
已经有一个4(nums[i])的话,有dp[1]种方法凑成总和为5
已经有一个5(nums[i])的话,有dp[0]种方法凑成总和为5
那么凑整dp[5]的总方法数也就是把所有的dp[j - nums[i]]累加起来);
3.初始化:dp[0]=1;(考虑把容量为0也当做一种方法,这样可以递推得到其他结果。若dp[0]是0,递推结果将都是0)
4.遍历顺序:涉及顺序(排列问题),先遍历背包嵌套遍历货币,背包一定是要正序遍历。

代码

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

☆☆☆☆☆KamaCoder 57. 爬楼梯(待补充)

题目链接:KamaCoder 57. 爬楼梯

题目分析

代码


标签:凑成,背包,题目,int,Day32,笔记,算法,遍历,dp
From: https://blog.csdn.net/m0_57632621/article/details/141420275

相关文章

  • Spark超全笔记 一站式搞定!!
    sparkSparkSpark和Hadoop的区别Spark计算流程Spark组成架构(spark的五大组件)Spark内核调度流程Spark并行度RDDRDD的五大特性RDD的创建RDD常用算子常用transformation算子常用action算子RDD缓存和checkpoint对比RDD依赖依赖管理DAG有向无环图为什么要进行stage划分Spar......
  • 【学习笔记】数学基础:Ferrers 图
    在分拆时我们有的时候很难搞,所以需要引入Ferrers图定义将分拆的每个部分用点组成的行表示,每行点的个数是这个部分的大小根据分拆的定义,Ferrers图中不同的行按照递减的顺序排放分拆:将自然数n写成递降正整数和的表示。\[n=r_1+r_2+\ldots+r_k\quadr_1\ger_2\ge\ldo......
  • BufferQueue的试用笔记
    简介BufferQueue是一个用.NET编写的高性能的缓冲队列实现,支持多线程并发操作。源码网站:https://github.com/eventhorizon-cli/BufferQueue功能设计支持创建多个Topic,每个Topic可以有多种数据类型。每一对Topic和数据类型对应一个独立的缓冲区。支持创建多个Cons......
  • [vue3] vue3更新组件流程与diff算法
    在Vue3中,组件的更新通过patch函数进行处理。patch函数源码位置:core/packages/runtime-core/src/renderer.tsatmain·vuejs/core(github.com)constpatch:PatchFn=(n1,n2,container,anchor=null,parentComponent=null,parentSuspen......
  • mini-lsm通关笔记Week1Day4
    项目地址:https://github.com/skyzh/mini-lsm个人实现地址:https://gitee.com/cnyuyang/mini-lsmTask1-SSTBuilder在此任务中,您需要修改:src/table/builder.rssrc/table.rsSST由存储在磁盘上的数据块和索引块组成。通常,数据块都是懒加载的-直到用户发出请求,它们才会被加载......
  • 【读书笔记-《30天自制操作系统》-6】Day7
    本篇向着移动鼠标的目标继续前进。先对中断处理进行一些补充说明,然后建立完善缓冲区来实现键盘数据接收。最后是在此基础上的初始化鼠标控制电路与鼠标的数据接收。1.中断处理程序补充说明前面的处理中,接收到键盘中断后只是显示一行信息,现在把按键的信息也一并显示出来......
  • Verilog刷题笔记55
    题目:Exams/ece2412014q5aYouaretodesignaone-inputone-outputserial2’scomplementerMoorestatemachine.Theinput(x)isaseriesofbits(oneperclockcycle)beginningwiththeleast-significantbitofthenumber,andtheoutput(Z)isthe2......
  • 【学习笔记】 陈强-机器学习-Python-Ch11 决策树(Decision Tree)
    系列文章目录监督学习:参数方法【学习笔记】陈强-机器学习-Python-Ch4线性回归【学习笔记】陈强-机器学习-Python-Ch5逻辑回归【课后题练习】陈强-机器学习-Python-Ch5逻辑回归(SAheart.csv)【学习笔记】陈强-机器学习-Python-Ch6多项逻辑回归【学习笔记及课后......
  • 学习笔记---Trie树
    Trie树又叫字典树、前缀树(PrefixTree)、单词查找树或键树,是一种多叉树结构,可以高效存储和查找字符串集合的数据结构.intson[N][26],cnt[N],idx;//0号点既是根节点,又是空节点//son[][]存储树中每个节点的子节点//cnt[]存储以每个节点结尾的单词数量//插入一......
  • C++ 有向图拓扑排序算法
    代码 #include<algorithm>#include<cassert>#include<functional>#include<map>#include<memory>#include<queue>#include<set>#include<unordered_set>#include<vector>namespacejc{templa......