首页 > 其他分享 >代码随想录训练营第三十七天| 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ 70. 爬楼梯 (进阶)

代码随想录训练营第三十七天| 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ 70. 爬楼梯 (进阶)

时间:2025-01-07 21:30:54浏览次数:3  
标签:遍历 进阶 int 随想录 背包 第三十七 public dp

完全背包理论

直接的说明就是把01背包的有限次选取变为无限次选取求最大价值

相对的 遍历方向也可以相互调换 因为dp[j]只需要上次的计算结果就行 

public class CarlcodeAllBag {
    public static void testCompletePack(){
        //先遍历物品 再遍历背包
        int[] weight = {1, 3, 4};
        int[] value = {15, 20, 30};
        int bagsize = 4;
        int[] dp = new int[bagsize + 1];
        for(int i = 0; i < weight.length; i++){
            //遍历物品
            for(int j = weight[i]; j <= bagsize; j++){//遍历背包
                dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
            }
        }
        for(int maxvalue : dp){
            System.out.println(maxvalue + " ");
        }
    }
}

518. 零钱兑换 II

题目链接:518. 零钱兑换 II - 力扣(LeetCode)

讲解链接:代码随想录

对上一次写的求目标和里的递推公式看不明白 导致我现在跟不上代码 得返工 讨厌返工

Java代码:

class Solution{
    public int change(int amount, int[] coins){
        //递推表达式
        int[] dp = new int[amount + 1];
        //初始化dp数组 表示金额为0 时只有一种情况 什么都不装
        dp[0] = 1;
        for(int i = 0; i < coins.length; i++){
            for(int j = coins[i]; j <= amount; j++){
                dp[j] = dp[j] + dp[j - coins[i]];
            }
        }
        return dp[amount];
    }
}

 377. 组合总和 Ⅳ

题目链接:377. 组合总和 Ⅳ - 力扣(LeetCode)

讲解链接:代码随想录

还是那个公式  现在看懂了 重新看了一遍 就是填满容积i一般大的背包需要dp[i]种可能的方案

class Solution{
    public int combinationSum4(int[] nums, int target){
        int[] dp = new int[target + 1];
        dp[0] = 1;
        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];
    }
}

 再多看看基础 基础要打牢固

 70. 爬楼梯 (进阶)

题目链接:代码随想录

讲解链接:代码随想录

 完全背包求排列问题 一旦扩展到m或n就可以用这个方法 比较泛用

先遍历背包再遍历物品 自己琢磨了一下 看了ai给我的解答看懂了

class Solution{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int m, n;
        while(sc.hasNextInt()){
            //从键盘输入参数 中间用空格隔开
            n = sc.nextInt();
            m = sc.nextInt();
            //求排列问题 先遍历背包再遍历物品
            int[] dp = new int[n + 1];
            dp[0] = 1;//初始化
            for(int j = 1; j <= n; j++){
                for(int i = 1; i <= m; i++){
                    if(j - i >= 0) dp[j] += dp[j - i];
                }
            }
            System.out.println(dp[n]);
        }
    }
}

打卡

标签:遍历,进阶,int,随想录,背包,第三十七,public,dp
From: https://blog.csdn.net/chengooooooo/article/details/144894176

相关文章

  • 前端主流布局系统进阶与实战笔记
    前端主流布局系统进阶与实战第1章课程介绍(了解本课程必看)采用传统开发模式采用流行框架整体的前端井喷式的发展单一布局已经无法满足需求精通现代布局四大核心技术grid网格布局flex弹性布局响应式布局크设计图相关概念PhotoShop切图详解与设计师配合标注工具:蓝湖、PxCook......
  • 洛谷题单指南-线段树的进阶用法-P4093 [HEOI2016/TJOI2016] 序列
    原题链接:https://www.luogu.com.cn/problem/P4093题意解读:一个序列,m个变化,求任意一个变化后不受影响的最长上升子序列长度。解题思路:设原序列为a[N],原序列经过变化后能得到的最大值序列为maxa[N],最小值序列为mina[N]设f[i]表示以第i个数结尾的最长不降子序列长度有f[i]=max......
  • 【代码随想录】刷题记录(91)-根据身高重建队列
    题目描述:假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i]=[hi,ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的......
  • 【代码随想录】刷题记录(92)-用最少数量的箭引爆气球
    题目描述:有一些球形气球贴在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i]=[xstart,xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切y坐标。一支弓箭可以沿着x轴从不同点 完全垂直 地射出。在坐标 x ......
  • 【SQL】进阶知识 — 各大数据库合并几条数据到一行的方式
    大家好,欢迎来到本期的SQL知识分享!今天我们要聊一个非常实用的技能:如何将多个行数据合并成一行!如果你曾经需要把多个查询结果合并成一个单元,或者把多行数据汇总到一个字段中,这篇文章将会教你如何用SQL来实现这一点。1.什么是“合并数据到一行”?“合并数据到一行”通常......
  • 代码随想录算法训练营第五十六天|KM108.冗余连接|KM109.冗余连接Ⅱ
    108.冗余连接本题光看题目没理解具体什么意思;看了题解有点明白了;(个人觉得还是力扣的题目描述比较容易理解)题目意思:大概就是加一条边使树结构有环,然后再环中去掉一条边(如果环中多条边可取,则去掉最后一条边),仍然变成一颗树结构;思路:观察两个节点是否再一个集合,如果不在,也可以将......
  • 代码随想录算法训练营第二十八天-贪心算法-122. 买卖股票的最佳时机II
    有奇妙的解法分析要获得利润,就是当天卖出前一天买入的的利润,也就是当天价格减去前一天的价格通过这样的运算,可以得到一个新的序列,这个序列就是上一道53的最大子序和的应用了而且把这些子序和中所有正数值都加到一起就是最大利润了#include<iostream>#include<vector>c......
  • 代码随想录 test1(二分详解,包括二分答案)
    一、二分查找关键:确定待查找的元素出现在什么区间内,循环不变量:目标值一定在当前搜索范围内。模板一:在左闭右闭区间内查找目标元素       由于待查找元素在左闭右闭区间,因此要想在已有数组内查找该元素,就要让初始左右指针分别为0,size-1(刚好覆盖整个数组)。   ......
  • 如何使用stable diffusion填充画外内容?(进阶版)
    大家好我是AIGC阿道夫目录一、outpaint步骤二、参数详解三、总结当我们尝试绘制高分辨率的图片时,传统的SD模型常常会遇到诸多问题,例如元素重复、显存不足和生成时间过长等。但如果只绘制低分辨率的图片,却很难生成丰富的画面元素和细节。我们可以借助outpaint来解决这......
  • 线段树进阶练习专题
    小白逛公园题目大意:求一段区间里最大子段和思路:有空补(code:#include<bits/stdc++.h>usingnamespacestd;constintMAXN=500100;intm,n;inta[MAXN];inlineintread(){ intx=0,f=1; charch=getchar(); while(ch>'9'||ch<'0'){ if(ch==&#......