代码随想录算法训练营第三十二天 | 完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、卡码网57. 爬楼梯

代码随想录算法训练营第三十二天任务

  • 完全背包理论
  • 卡码网52. 携带研究材料
  • 518.零钱兑换II
  • 377. 组合总和 Ⅳ
  • 卡码网57. 爬楼梯

完全背包理论

有N件物品和⼀个最多能背重量为W的背包。第 i 件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放⼊背包多次),求解将哪些物品装入背包里物品价值总和最大。
完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。
eg:
背包最大重量为4。
物品为:

每件商品都有无限个!
问背包能背的物品最大价值是多少?

  1. 确定dp数组的含义
    dp[i][j] 表示背包容量为j的背包能背[0~i]中物品的最大价值。
  2. 确定递推公式。
    不装当前物品 i : dp[i][j] = dp[i - 1][j]
    装当前物品 i : dp[i][i] = dp[i][j - weight[i]] + value[i]
    因为每件商品有无限个,所以不是dp[i - 1][i - weight[i]], 而是dp[i][j - weight[i]], 之前这个物品装入过,但因为有空间,还可以再装入。
    dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i])
  3. 初始化
    dp[i][0]: 背包容量为0,什么物品都装不下,所以为0。
    因为dp[i][j] 由上方和左方推倒而来,所以dp[0][j] 需要初始化。
    只要容量能装下物品0,就可劲装:
    j > weight[0]: dp[0][j] = dp[0][j - weight[0]] + value[0];
  4. 确定遍历顺序
    完全背包的物品是可以添加多次的,所以要从小到大去遍历
    // 先遍历物品,再遍历背包for(inti=0;i<weight.size();i++)// 遍历物品{for(intj=weight[i];j<=bagWeight;j++)// 遍历背包容量{dp[i][j]=max(dp[i-1][j],dp[i][j-weight[i]]+value[i]);}}// 先遍历背包,再遍历物品for(intj=0;j<=bagWeight;j++)// 遍历背包容量{for(inti=0;i<weight.size();i++)// 遍历物品{if(j-weight[i]>=0)dp[i][j]=max(dp[i-1][j],dp[i][j-weight[i]]+value[i]);}}
  5. 举例推导dp数组

纯完全背包的面试题:要求先用二维dp数组实现,然后再用一维dp数组实现,最后在问,两个for循环的先后是否可以颠倒?为什么?

如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。 377.组合总和IV

卡码网52. 携带研究材料

题目链接:卡码网52. 携带研究材料

#include<iostream>#include<vector>usingnamespacestd;intmain(){intitem,totalWeight;cin>>item>>totalWeight;vector<int>weight(item,0);vector<int>value(item,0);for(inti=0;i<item;++i){cin>>weight[i];cin>>value[i];}// dp[i][j] [0~i]类物品中装入容量为j的行李中的最大价值vector<vector<int>>dp(item,vector<int>(totalWeight+1,0));// 初始化第一行for(intj=weight[0];j<=totalWeight;++j){dp[0][j]=dp[0][j-weight[0]]+value[0];}for(inti=1;i<item;++i){// 物品for(intj=0;j<=totalWeight;++j){// 容量if(j<weight[i])dp[i][j]=dp[i-1][j];else{dp[i][j]=max(dp[i-1][j],dp[i][j-weight[i]]+value[i]);}}}cout<<dp[item-1][totalWeight]<<endl;return0;}

518.零钱兑换II

题目链接:518.零钱兑换II
这道题很契合完全背包问题。
coins数组相当于物品,amount相当于背包。
只不过这里的dp[i][j] 不表示价值,而是表示凑成这个amount有多少种方式。多少和494. 目标和有点相似。目标和是01背包问题,这道题是完全背包问题。

  1. 确定dp[i][j]的含义
    dp[i][j] 表示 coins中下标为[0~i]的数凑成金额 j 的组合数。
  2. 确定递推公式
    不包含当前下标为 i 的coin,dp[i][j] = dp[i - 1][j]
    包含当前下标为 i 的coin, dp[i][j] = dp[i][j - coins[i]]
    dp[i][j] = dp[i - 1][j] + dp[i][j - coins[i]]
  3. 初始化
    凑成金额为0的组合数相当于什么都不选,算一种方式,即dp[i][0] = 1;
    当 j % coins[0] == 0, dp[0][j] = 1;
  4. 遍历顺序
    从小到大遍历
  5. 举例推到dp数组
classSolution{public:intchange(intamount,vector<int>&coins){// dp[i][j] 表示 coins中下标为[0~i]的数凑成金额 j 的组合数。intn=coins.size();vector<vector<uint64_t>>dp(n,vector<uint64_t>(amount+1,0));// 小面值硬币组合出大金额,组合方式爆炸式增长,可能超出64 位整数上限。// 初始化for(intj=0;j<=amount;++j){if(j%coins[0]==0)dp[0][j]=1;}for(inti=1;i<n;++i){dp[i][0]=1;for(intj=1;j<=amount;++j){if(j<coins[i])dp[i][j]=dp[i-1][j];elsedp[i][j]=dp[i-1][j]+dp[i][j-coins[i]];}}returndp[n-1][amount];}};

377. 组合总和 Ⅳ

题目链接:377. 组合总和 Ⅳ
这道题和518.零钱兑换II相似,不同之处在于这道题把顺序不同的序列视为不同的组合。

  1. 确定dp[i][j]的含义
    dp[i][j] 表示 使用下标为 0~i 数字凑成总和为 j 的排列数量。
  2. 确定递推公式
    不包含当前下标为 i 的num,dp[i][j] = dp[i - 1][j]
    包含当前下标为 i 的coin, dp[i][j] = dp[n][j - nums[i]]
    dp[i][j] = dp[i - 1][j] + dp[n][j - nums[i]]
    为什么不是 dp[i][j - nums[i]]?
    当使用 nums[i] 时,剩余和 j - nums[i] 的凑法必须允许再次使用所有数字,才能体现排列。
    其中 n 是数组总长度,dp[n][…] 表示所有数字都可用的状态。
  3. 初始化
    凑成为0的组合数相当于什么都不选,算一种方式,即dp[i][0] = 1;
  4. 遍历顺序
    从小到大遍历
  5. 举例推到dp数组
classSolution{public:intcombinationSum4(vector<int>&nums,inttarget){// dp[i][j] 表示 nums中下标为[0~i]的数组合成和为 target 的组合排列数。intn=nums.size();vector<vector<uint64_t>>dp(n+1,vector<uint64_t>(target+1,0));// 初始化for(inti=0;i<=n;++i){dp[i][0]=1;// 凑成 0 都有 1 种方法}for(intj=1;j<=target;++j){for(inti=1;i<=n;++i){if(j<nums[i-1])dp[i][j]=dp[i-1][j];elsedp[i][j]=dp[i-1][j]+dp[n][j-nums[i-1]];}}returndp[n][target];}};

卡码网57. 爬楼梯

题目链接:卡码网57. 爬楼梯

思路同上题!

#include<iostream>#include<vector>usingnamespacestd;intmain(){intn,m;cin>>n>>m;// n 相当于 背包容量, 1 ~ m 相当于物品,可以重复装vector<vector<int>>dp(m+1,vector<int>(n+1,0));// 初始化for(inti=0;i<=m;++i){dp[i][0]=1;}for(intj=1;j<=n;++j){for(inti=1;i<=m;++i){if(j<i)dp[i][j]=dp[i-1][j];elsedp[i][j]=dp[i-1][j]+dp[m][j-i];}}cout<<dp[m][n]<<endl;return0;}

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

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

相关文章

【题解】CSP-J/S 2025 补题

CSP-J 2025 题解 拼数(number) 思路 维护一个桶,统计字符串中各数字的出现次数。按数字大小倒序输出对应数量个数字即可。 注意前导零的情况。 实现 #include<bits/stdc++.h> using namespace std; const int…

音元系统:摘要

摘要 音元系统是由音元构成的语音系统。这种语音系统主要具有六个特征&#xff1a; 语音是由音元构成的系统 音节是由音元构成的音列 音元是指表示片音的变元 片音是能单发的最小短音 片音是比音素还小的音段 拼音是按照片音序列发音 在现代通用汉语中&#xff0c;音元…

26 avl树(下)

#define _CRT_SECURE_NO_WARNINGS 1 #include<vector> #include"AVLTree.h"void TestAVLTree1() {AVLTree<int, int> t;// 常规的测试用例int a[] { 16, 3, 7, 11, 9, 26, 18, 14, 15 };// 特殊的带有双旋场景的测试用例//int a[] { 4, 2, 6, 1, 3, 5,…

从“写代码”到“定义问题”——AI 时代程序员的生存宣言

本文原创公开首发于 CSDN 如需转载&#xff0c;请在文首注明出处与作者&#xff1a;yu779 从“写代码”到“定义问题”——AI 时代程序员的生存宣言 > “AI 一天写的代码&#xff0c;比我一周都多&#xff0c;那我还有存在的意义吗&#xff1f;” > 带着这个灵魂拷问&am…

音元系统:目录

目录 1 绪论 2 已有析音法 2.1 已有各式析音法的分类 2.1.1 各类各式二分法 2.1.1.1 两段二分法 2.1.1.1.1 声韵二分法 2.1.1.1.2 首干二分法 2.1.1.2 质调二分法 2.1.2 一调二质分析法 2.1.2.1 节调声质韵质分析法 2.1.2.2 节调声母韵母分析法 2.1.3 一调三质分析…

Java毕业设计不会做怎么办?

同学别慌&#xff0c;毕业设计确实是大学生涯的一大挑战&#xff0c;但完全有办法解决。很多同学都经历过这个阶段&#xff0c;我们一步步来梳理。 &#x1f50d; 第一步&#xff1a;冷静分析现状 明确截止时间 - 离答辩还有多少周&#xff1f; 评估当前进度 - 是完全没开始&…

基于深度学习的文物图像修复系统

基于深度学习的文物图像修复系统 1. 项目背景与意义 文物是人类文明的瑰宝&#xff0c;但随着时间的推移&#xff0c;许多文物&#xff08;如壁画、古画、照片等&#xff09;不可避免地遭受了自然风化、虫蛀、霉变或人为损坏&#xff0c;导致出现了裂缝、污渍、缺失等问题。传统…

Java毕业设计做不出来可以找代做吗?

这是一个非常敏感且重要的问题&#xff0c;我需要给你最负责任、最真诚的回答。直接答案&#xff1a;强烈不建议&#xff0c;风险极高&#xff0c;有百害而无一利。我理解你现在可能感到焦虑和无助&#xff0c;但寻找代做是一条会让你陷入更大麻烦的危险捷径。让我详细分析一下…

零基础理解k8s - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

连接2026:十款远程控制软件真实力横评与选择指南

目录引&#x1f4c8; 选择前必读&#xff1a;明确你的核心需求&#x1f3c6; 综合王者&#xff1a;ToDesk&#xff08;评分 9.6/10&#xff09;&#x1f3af; 细分领域佼佼者&#x1f3ae; 为游戏而生&#xff1a;网易UU远程&#xff08;评分 8.4/10&#xff09;&#x1f3ac; …

openvela——动态管理日志输出通道及其实现原理

在《Vela rpmsg log 实现原理》中提到 vela 日志输出支持多通道日志输出&#xff0c;它们是在系统运行前期配置好的&#xff0c;所以无法将它们动态删除。但是可以控制使能、禁用某通道&#xff0c;达到相应通道输出、不输出日志的目的。接下来篇章将讲述”动态管理日志输出通道…

JavaScript 引擎中的分支预测器(Branch Predictor)友好性:如何写出减少 CPU 误判的代码

各位开发者、架构师们&#xff0c;晚上好&#xff01;今天&#xff0c;我们将深入探讨一个在高性能计算领域至关重要&#xff0c;但在日常JavaScript开发中却常常被忽视的议题&#xff1a;JavaScript引擎中的分支预测器友好性。我们将学习如何编写代码&#xff0c;以减少CPU的误…

Draco 3D压缩终极指南:如何高效处理大型3D模型文件

Draco 3D压缩终极指南&#xff1a;如何高效处理大型3D模型文件 【免费下载链接】draco Draco is a library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics. 项目地址: h…

可以把 Windows 从 C盘迁移到 SSD 吗?

可以把 Windows 从 C盘迁移到 SSD 吗&#xff1f;yes, you can move windows from the c: drive to an ssd, and doing so can make your computer faster. the process usually means copying the operating system, programs, and settings from an old hard drive to a new …

Overleaf插件定制实战指南:3分钟搞定编辑器功能优化

Overleaf插件定制实战指南&#xff1a;3分钟搞定编辑器功能优化 【免费下载链接】overleaf A web-based collaborative LaTeX editor 项目地址: https://gitcode.com/GitHub_Trending/ov/overleaf 你是不是也遇到过这样的困扰&#xff1a;用Overleaf写论文时&#xff0c…

Day 37 - 早停策略与模型权重的保存

在深度学习的训练过程中&#xff0c;我们经常面临两个核心问题&#xff1a;“训练到什么时候停止&#xff1f;” 和 “训练好的模型怎么存&#xff1f;”。如果训练时间太短&#xff0c;模型欠拟合&#xff1b;训练时间太长&#xff0c;模型过拟合。手动盯着Loss曲线决定何时停…

JavaScript 的数值计算精度:Kahan 求和算法在处理大量浮点数累加时的应用

各位同学&#xff0c;各位同仁&#xff0c;大家好&#xff01; 今天&#xff0c;我们将深入探讨一个在日常编程中常常被忽视&#xff0c;但在处理大量数值数据时又至关重要的话题&#xff1a;JavaScript 中的浮点数计算精度。特别是&#xff0c;我们将聚焦于一个巧妙的算法——…

15、Linux 系统下的邮件与即时通讯使用指南

Linux 系统下的邮件与即时通讯使用指南 1. Linux 系统中的邮件客户端 在人们提及互联网时,往往首先想到的是万维网,但实际上电子邮件可能是最常用且最受欢迎的互联网应用之一。对于 Linux 用户而言,有众多的电子邮件程序可供选择,不同的 Linux 发行版默认的邮件客户端也各…

微信遥控Mac:WeChatPlugin远程控制终极指南

微信遥控Mac&#xff1a;WeChatPlugin远程控制终极指南 【免费下载链接】WeChatPlugin-MacOS 微信小助手 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPlugin-MacOS 你是否曾经想过&#xff0c;躺在沙发上就能控制远在书房里的Mac电脑&#xff1f;或者在外出时突…

为什么 C盘空间会莫名其妙减少(即使没装新软件)?

为什么 C盘空间会莫名其妙减少&#xff08;即使没装新软件&#xff09;&#xff1f;你有没有注意到c盘空间在减少&#xff0c;即使你没有安装新程序, 这个常见问题可能让人担心, 但通常有明确原因, windows和其他软件会定期创建临时文件、系统备份和更新, 占用磁盘空间而不会每…