动态规划篇-代码随想录算法训练营第三十六天l 279.完全平方数,139.单词拆分,多重背包问题

ops/2024/9/22 21:07:49/

279.完全平方数

题目链接:. - 力扣(LeetCode)

讲解视频:

换汤不换药!| LeetCode:279.完全平方数

题目描述:

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

输入:n = 12
输出:3 
解释:12 = 4 + 4 + 4

解题思路:

完全背包问题变形

1. 状态表示:

dp[i] 表示:和为 i 的完全平⽅数的最少数量。

2. 状态转移⽅程:

对于 dp[i] ,可以根据小于等于 i 的所有完全平⽅数 x 进⾏划分:

  • x = 1 时,最⼩数量为: 1 + dp[i - 1] ;
  • x = 4 时,最⼩数量为: 1 + dp[i - 4] ......⼀直枚举到 x <= i 为⽌。

为了⽅便枚举完全平⽅数,我们采⽤下⾯的策略: for(int j = 1; j * j <= i; j++)综上所述,状态转移⽅程为:dp[i] = min(dp[i], dp[i - j * j] + 1)

3. 初始化:

当 n = 0 的时候,没法拆分,结果为 0 ;当 n = 1 的时候,显然为 1 。

4. 填表顺序:

从左往右。

5. 返回值:

根据题意,返回 dp[n] 的值。

代码:

class Solution {
public:const int INF = 0x3f3f3f3f;int numSquares(int n) {vector<int> dp(n+1,INF);dp[0] = 0;for(int i = 1; i*i <= n; i++)for(int j = i*i; j <= n; j++)dp[j] = min(dp[j],dp[j-i*i]+1);return dp[n];}
};

139.单词拆分

题目链接:. - 力扣(LeetCode)

讲解视频:

你的背包如何装满?| LeetCode:139.单词拆分

题目描述:

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。

解题思路:

1. 状态表示:

对于线性 dp ,我们可以⽤「经验 + 题⽬要求」来定义状态表⽰:

  1. 以某个位置为结尾;
  2. 以某个位置为起点。

这⾥我们选择⽐较常⽤的⽅式,以某个位置为结尾,结合题⽬要求,定义⼀个状态表⽰:dp[i] 表示: [0, i] 区间内的字符串,能否被字典中的单词拼接⽽成。

2. 状态转移⽅程:

对于 dp[i] ,为了确定当前的字符串能否由字典⾥⾯的单词构成,根据最后⼀个单词的起始位置 j ,我们可以将其分解为前后两部分:

  1. 前⾯⼀部分 [0, j - 1] 区间的字符串;
  2. 后⾯⼀部分 [j, i] 区间的字符串。其中前⾯部分我们可以在 dp[j - 1] 中找到答案,后⾯部分的⼦串可以在字典⾥⾯找到。

因此,我们得出⼀个结论:当我们在从 0 ~ i 枚举 j 的时候,只要 dp[j - 1] = true并且后⾯部分的⼦串 s.substr(j, i - j + 1) 能够在字典中找到,那么 dp[i] =true 。

3. 初始化:

可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化。使⽤这种技巧要注意两个点:

  1. 辅助结点⾥⾯的值要「保证后续填表是正确的」;
  2. 「下标的映射关系」。

在本题中,最前⾯加上⼀个格⼦,并且让 dp[0] = true ,可以理解为空串能够拼接⽽成。其中为了⽅便处理下标的映射关系,我们可以将字符串前⾯加上⼀个占位符 s = ' ' + s ,这样就没有下标的映射关系的问题了,同时还能处理「空串」的情况。

4. 填表顺序:

显⽽易⻅,填表顺序「从左往右」。

5. 返回值:

由「状态表⽰」可得:返回 dp[n] 位置的布尔值。

代码:

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> st;for(auto x : wordDict) st.insert(x);int n = s.size();vector<bool> dp(n+1);dp[0] = true;s = " " + s;for(int i = 1; i <= n; i++)for(int j = 1; j <= i; j++){if(dp[j-1] && st.count(s.substr(j,i-j+1))){dp[i] = true;break;}}return dp[n];}
};

多重背包问题

题目链接:56. 携带矿石资源(第八期模拟笔试)

题目描述:

你是一名宇航员,即将前往一个遥远的行星。在这个行星上,有许多不同类型的矿石资源,每种矿石都有不同的重要性和价值。你需要选择哪些矿石带回地球,但你的宇航舱有一定的容量限制。 

给定一个宇航舱,最大容量为 C。现在有 N 种不同类型的矿石,每种矿石有一个重量 w[i],一个价值 v[i],以及最多 k[i] 个可用。不同类型的矿石在地球上的市场价值不同。你需要计算如何在不超过宇航舱容量的情况下,最大化你所能获取的总价值。

解题思路:

在01背包问题基础上加一个for循环遍历一个每种商品的数量。

代码:

#include<iostream>
#include<vector> 
using namespace std;int main()
{int space, n;cin >> space >> n;vector<int> weight(n+1);vector<int> value(n+1);vector<int> nums(n+1);for(int i = 1; i <= n; i++) cin >> weight[i];for(int i = 1; i <= n; i++) cin >> value[i];for(int i = 1; i <= n; i++) cin >> nums[i];vector<int> dp(space+1);for(int i = 1; i <= n; i++)for(int j = space; j >= weight[i]; j--)for(int k = 1; k <= nums[i] && j >= k * weight[i]; k++)dp[j] = max(dp[j], dp[j-k*weight[i]]+k*value[i]);cout << dp[space] <<endl;return 0;
}


http://www.ppmy.cn/ops/98667.html

相关文章

分享一个基于python的抖音短视频流量数据分析与可视化系统Hive大数据源码(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

解决Intel-12代13代14代大小核调用导致VMware虚拟机性能低

0x01 设备信息 近期入手的是一台2023款 y9000p 游戏本&#xff0c;CPU为13500h 显卡为RTX4060。 0x02 VMware虚拟机遇到的性能问题 尤其是windows虚机明显感觉性能非常差&#xff0c;开几个网页都很卡。 我一度怀疑是CPU i5性能差&#xff0c;还没我的轻薄本运行速度快&…

组合模式 详解

组合模式 简介: 将对象组合成树形结构以表示"部分-整体"的层次结构, 使得用户对单个对象和组合对象的使用具有一致性. 组合模式也是一种结构类型的模式.看简介比较容易理解, 毕竟树形结构是数据结构必修的, 我们仍然举个例子方便理解 以公司的组织架构为例 公司 - …

自然语言处理系列三十二》 语义相似度》语义相似度概念及入门

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列三十二语义相似度概念及入门同义词词林 总结 自…

html文件运行后界面反馈xxx拒绝连接

概述&#xff1a;我的html代码中包含了外站界面&#xff0c;运行后界面反馈到xxx拒绝连接&#xff0c;我尝试了网上的诸多方法&#xff0c;例如换一个浏览器运行&#xff0c;修改主机网络设置&#xff0c;更改浏览器DNS都没有作用。 <!DOCTYPE html> <html> <h…

数学建模学习(117):四阶龙格-库塔方法从理论到Python/matlab实践

文章目录 1. 概述2. 输入要求3. 公式介绍4. 实例与应用案例 1: 使用h = 0.5解决问题案例2: 使用不同步长 h = 0.2和h = 0.05 的比较案例 3: 自适应步长控制与Runge-Kutta-Fehlberg方法5. 代码实现5.1 Python实现四阶龙格-库塔方法5.2 Matlab实现四阶龙格-库塔方法5.3 Matlab实现…

【Selenium+Pytest+allure报告生成自动化测试框架】附带项目源码和项目部署文档

前言 selenium自动化 pytest测试框架allure报告 本章你需要 一定的python基础——至少明白类与对象&#xff0c;封装继承 一定的selenium基础——本篇不讲selenium&#xff0c;不会的可以自己去看selenium中文翻译网 文章末尾给大家留下了大量的福利】 测试框架简介 测试框…

wpf 定制 个性圆角信息面板

先上图&#xff1a; 代码实现&#xff1a; <Canvas Grid.Column"1"><Border Background"#5665F4" BorderBrush"#5665F4" BorderThickness"0.5" CornerRadius"10,10,10,30"Width"180" Height"165&qu…