代码随想录算法训练营第三十八天|完全背包,518. 零钱兑换 II ,377. 组合总和 Ⅳ

完全背包

例题:有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。

区别:完全背包和01背包问题唯一不同的地方就是,每种物品有无限件

公式推导:01背包问题是从二维数组压缩到一维数组,由于一维数组要保证每次取得物品不重合,遍历顺序也就变成了从后向前遍历。但是完全背包问题每种物品数量不限制数量,也就是说不需要防止重合情况,那问题就变成了一维数组或者说是滚动数组从前往后遍历

首先再回顾一下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]);

    }
}

 注意:这里j什么要从weight[i]开始,因为当j小于weight[i]时,也就是当前容量不足以装下当前第i个物品,所以每次在遍历开始都要从weight[i]开始。

dp数组初始化:dp[j]=0,也就是没放物品时,不管容量多大,价值都是0;

举例推导dp公式:

背包最大重量为4。

物品为:

重量价值
物品0115
物品1320
物品2430

每件商品都有无限个!

问背包能背的物品最大价值是多少?

我们来走一遍流程:

只可以选物品0时:随着容量变大,不断放进物品0就行,直到装满,结果就出来了 ;

可以选物品0和物品1时:首先容量0-2时,物品1放不进,所有直接将上一步结果放入,这一步其实也就是解释了为什么二维数组可以被压缩,也解释了为什么j要从weight[i]开始;

        牢记dp[j]是代表j容量的背包填满,最大价值是多少。

 当容量变成3(j=weight[i])以后,dp[j]发生了什么,dp[j]有两个来源:

①不加入物品1,那就是和上一步结果一样,所以取dp[3];

②加入物品1,首先容量得腾出位置来放物品1,所以3-weight[1],也就是容量变成1了,当j=1时,dp[1]=15(最大价值是15),再加上物品1的价值value[1]=20,所以dp[3-weight[1]]+value[1]。进行最后一步,选出dp[3]和dp[3-weight[1]]+value[1]的最大值,就是当前容量填满放进去物品的最大价值。

        最后,j=4或者物品2也在选择范围时,就可以用公式:

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

完整代码: 注意这里先开始遍历物品再开始遍历背包容量,反过来也可以,区别于一维01背包。

void test_CompletePack() {
    vector<int> weight = {1, 3, 4};
    vector<int> value = {15, 20, 30};
    int bagWeight = 4;
    vector<int> dp(bagWeight + 1, 0);
    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]);
        }
    }
    return dp[bagWeight];
}

518. 零钱兑换 II - 力扣(LeetCode)

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

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。

假设每一种面额的硬币有无限个。 

题目数据保证结果符合 32 位带符号整数。

示例 1:

输入:amount = 5, coins = [1, 2, 5]
输出:4
解释:有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

示例 2:

输入:amount = 3, coins = [2]
输出:0
解释:只用面额 2 的硬币不能凑成总金额 3 。

思路:完全背包问题,amount就是背包容量,coins就是可以选择的物品。

解决:动态规划五部步曲

        1.确定dp[j]的含义;

        dp[j]:凑成总金额j的货币组合数为dp[j]。注意这里dp[j]求得是组合数,不是硬币的总额。

        2.确定递推公式;

        和494.目标和类似,dp[j]+=dp[j-coins[i]]

        3.确定dp初始化;

        还是和494.目标和类似,dp[0]=1;

代码随想录算法训练营第三十七天|1049. 最后一块石头的重量 II ,494. 目标和,474.一和零-CSDN博客

        4.确定遍历顺序;

        先遍历硬币,再遍历金额,里层遍历从前向后遍历,因为硬币可以重复用。

        5.举例推导dp数组。

输入: amount = 5, coins = [1, 2, 5] ,dp状态图如下:

代码:

class Solution {
public:
    int change(int amount, vector<int>& coins) {
        vector<int> dp(amount+1,0);
        dp[0]=1;
        for(int i=0;i<coins.size();i++){
            for(int j=coins[i];j<=amount;j++){
                dp[j]+=dp[j-coins[i]];
            }
        }
        return dp[amount];
    }
};

377. 组合总和 Ⅳ - 力扣(LeetCode)

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

示例 1:

输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。

思路:这里nums是可以重复的,可以转换成完全背包问题。

        ①物品:这里物品就是nums里面元素;

        ②背包:就是组合,但是这里要求的是组合数量,所以dp数组里不是放价值,是放组合的数量;

        拿示例1来说,就是需要背包物品总价值为4(j=4),从nums中选物品(可以重复)放入背包,有7种组合dp[j]。

解决:动态规划五步曲

        1.确定dp[j]含义;

        dp[j]就表示目标数为j的组合有dp[j]种。

        2.确定递推公式;

        和上题一样,dp[j]=dp[j]+dp[j-nums[i]]

        3.确定dp初始化;

        dp[j]初始都为0,dp[0]=1。

        4.确定遍历顺序;

                ①由于可以重复选取元素,所以这是一个完全背包问题

                ②其次组合顺序不同也算一种新组合,题目要的其实是排列

                循环方式就两种:外循环物品,内循环目标数;外循环目标数,内循环物品。

        如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!

        所以本题遍历顺序最终遍历顺序:target(背包)放在外循环,将nums(物品)放在内循环,内循环从前到后遍历。同样举个例子,当j=3时,我可以先取1再取2,或者先取2再取1,因为当前循环target没变,是通过遍历nums数组去组合。

        5.举例推导dp数组。

代码:

注意:C++测试用例有两个数相加超过int的数据,所以需要在if里加上dp[i] < INT_MAX - dp[i - num]。

class Solution {
public:
    int combinationSum4(vector<int>& nums, int target) {
        vector<int> dp(target+1,0);
        dp[0]=1;
        for(int j=0;j<=target;j++){//遍历容量
            for(int i=0;i<nums.size();i++){//遍历物品
                if(j-nums[i]>=0&&dp[j] < INT_MAX - dp[j - nums[i]]){
                    dp[j]=dp[j]+dp[j-nums[i]];
                }
            }
        }
        return dp[target];
    }
};

        防止数组越界 要判断j-nums[i]>=0。

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

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

相关文章

前端处理后端返回的字典值

<template><div></div> </template><script> export default {data () {return {data: {10: 北京,110: 山东},optionsData: []}},methods: {tranFn() {console.log(data>>>, this.data)const arr []for (let i 0; i < Object.keys…

数据库事务:保障数据一致性的基石

目录 1. 什么是数据库事务&#xff1f; 1.1 ACID特性解析 2. 事务的实现与控制 2.1 事务的开始和结束 2.2 事务的隔离级别 3. 并发控制与事务管理 3.1 并发控制的挑战 3.2 锁和并发控制算法 4. 最佳实践与性能优化 4.1 事务的划分 4.2 批处理操作 5. 事务的未来发展…

Vue脚手架 生命周期 组件化开发

Vue脚手架 & 生命周期 & 组件化开发 一、今日目标 1.生命周期 生命周期介绍生命周期的四个阶段生命周期钩子声明周期案例 2.综合案例-小黑记账清单 列表渲染添加/删除饼图渲染 3.工程化开发入门 工程化开发和脚手架项目运行流程组件化组件注册 4.综合案例-小兔…

【往届见刊检索速度hin OK】 第五届计算机工程与应用国际学术会议 (ICCEA 2024)

第五届计算机工程与应用国际学术会议 (ICCEA 2024) 2024 5th International Conference on Computer Engineering and Application 2024年4月12-14日 中国-杭州 计算机工程与应用在人工智能、大数据、云计算、物联网、网络安全等领域发挥着重要作用&#xff0c;随着科技日…

分布式和微服务区别

1.分布式 微服务和分布式的区别 1.将一个大的系统划分为多个业务模块&#xff0c;业务模块分别部署到不同的机器上&#xff0c;各个业务模块之间通过接口进行数据交互。区别分布式的方式是根据不同机器不同业务。 2.分布式是否属于微服务&#xff1f; 答案是肯定的。微服务的意…

智能优化算法应用:基于食肉植物算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于食肉植物算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于食肉植物算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.食肉植物算法4.实验参数设定5.算法结果6.参考…

Redis如何保证与数据库的一致性

双写一致性 redis与数据库不一致的两种情况解决办法 redis与数据库不一致的两种情况 出现在高并发场景下&#xff0c;当有数据读和写的请求&#xff0c;就可能出现数据库与缓存不一致的情况 一、先操作删除缓存&#xff0c;再修改数据库数据的情况下 当缓存被线程一删除后&…

[mac系统]利用换行符查找替换^p 报错 --caption_column‘ calue ‘test‘ needs to be one of: image

报错内容 代码内容 args.image_column "image" args.caption_column "text" 问题原因&#xff1a; 训练过程需要blip文件是metadata.json格式 ​ 测试过程需要的文件是txt格式 blip.txt​ ​ 解决办法 1 利用word查找替换 用{"file_name": &…

Git

第1章 Git 概述 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。 Git 易于学习&#xff0c;占地面积小&#xff0c;性能极快。 它具有廉价的本地库&#xff0c;方便的暂存区域和多个工作流分支等特性。其性能优于 Subversi…

个人信息展示网站需求分析报告

目录 一. 概述1.1 设计目的1.2 术语定义 二. 需求分析三. 系统功能需求3.1 功能总览3.2 业务流程图1.系统用例图2.系统流程 四.开发技术4.1 技术组成 五.界面及运行环境1.用户界面2.运行环境 一. 概述 1.1 设计目的 兴趣使然。将知识点综合运用。CSDN有功能限制&#xff0c;因…

数据结构线性表-栈和队列的实现

1. 栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 …

2023年最新prometheus + grafana搭建和使用

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户&#xff1a; -M 不创建家目录&#xff0c; -s 不让登录 useradd…

2.6 A 的 LU 分解

一、A LU 线性代数很多关键的概念实际上就是矩阵的分解&#xff08;factorization&#xff09;。原始矩阵 A A A 变成两个或三个特殊矩阵的乘积。第一个分解&#xff0c;实际上也是最重要的分解&#xff0c;来自消元法。因子 L L L 和 U U U 都是三角形矩阵&#xff0c;分…

用 @icestack/ui 构建适配微信小程序的 daisyui

用 icestack/ui 构建适配微信小程序的 daisyui 用 icestack/ui 构建适配微信小程序的 daisyui 前言思考与实践如何使用? 安装初始化配置构建样式 作为 tailwindcss plugin 来使用 安装配置智能提示 在微信小程序里使用 安装注册构建 演示小程序收到启发的项目参考地址 前言…

在pom.xml中添加maven依赖,但是类里面import导入的时候报错

问题&#xff1a; Error:(27, 8) java: 类TestKuDo是公共的, 应在名为 TestKuDo.java 的文件中声明 Error:(7, 23) java: 程序包org.apache.kudu不存在 Error:(8, 23) java: 程序包org.apache.kudu不存在 Error:(9, 23) java: 程序包org.apache.kudu不存在 Error:(10, 30) jav…

网工内推 | 外企、合资公司急招网工,国内外旅游,健身年卡

01 深圳市耐施菲信息科技有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责项目的计划、实施、过程管控、项目验收等工作&#xff1b; 2、负责大型项目设备实施、安装调试等售后维护工作&#xff1b; 3、分析、设计网络拓扑结构、配置H3C、华为等交换机…

Unity3D中实现箭头指向目标点的效果(shader)

系列文章目录 Unity工具 文章目录 系列文章目录前言一、效果如下二、制作步骤2-1、制作shader2-2、shader代码2-3、制作材质球2-4、新建Quad2-5、制作预制体2-6 、实现代码2-7、设置Quad到脚本2-8、路径设置如下 三、说明四、运行程序总结 前言 大家好&#xff0c;我是心疼你…

将 ONLYOFFICE 协作空间的公共房间嵌入到网页

在 ONLYOFFICE 协作空间2.0版本中&#xff0c;我们新增了公共房间&#xff0c;可与外部用户共享文件。公共房间可以集成到您的网站或单页应用程序 (SPA) 中&#xff0c;访问者无需下载或注册自己的协作空间帐户即可查看文档。我们在本文中介绍了分步指南。 什么是公共房间&…

【vtkWidgetRepresentation】第六期 vtkFinitePlaneRepresentation

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享VTK中的平面Plane表示方法&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; …

为什么数据科学应用要使用Python作为实现工具

1.3 为什么要使用Python作为实现工具 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.3节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0…