代码随想录算法训练营第四十六天|139.单词拆分,多重背包,背包问题总结

本文主要是介绍代码随想录算法训练营第四十六天|139.单词拆分,多重背包,背包问题总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 139.单词拆分
    • 思路
    • 代码
  • 多重背包
    • 思路
    • 代码
  • 背包问题总结

139.单词拆分

题目链接:704. 二分查找

文档讲解:代码随想录

视频讲解:动态规划之完全背包,你的背包如何装满?| LeetCode:139.单词拆分

思路

dp数组dp[i]表示长度为i的字符串是否可以拆分为一个或多个再字典中出现的单词。

递推公式:如果dp[j]为true,且[j, i]区间的字串出现在字典中,则dp[i]为true。

如:对于dp[i],遍历j=0~i,如果字串[j, i]出现在字典中,且dp[j]为true,则dp[i]为true。

代码

class Solution {
public:bool wordBreak(string s, vector<string> &wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vector<bool> dp(s.size() + 1, false);dp[0] = true;for (int i = 0; i <= s.size(); i++) {for (int j = 0; j <= i; j++) {string word = s.substr(j, i - j);if (wordSet.find(word) != wordSet.end() && dp[j])dp[i] = true;}}return dp[s.size()];}
};

多重背包

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

文档讲解:代码随想录

思路

将多重背包中的所有物品展开,则转换为01背包问题。

代码

#include <iostream>
#include <vector>
#include <string>
#include <unordered_set>using namespace std;int main() {int C, N;cin >> C >> N;vector<int> weights(N, 0);vector<int> values(N, 0);vector<int> nums(N, 0);for (int i = 0; i < N; i++)cin >> weights[i];for (int i = 0; i < N; i++)cin >> values[i];for (int i = 0; i < N; i++)cin >> nums[i];int num_count = 0;for (auto i : nums)num_count += i;vector<int> stones_weights(num_count, 0);vector<int> stones_values(num_count, 0);int index = 0;for (int i = 0; i < N; i++) {for (int j = 0; j < nums[i]; j++) {stones_weights[index] = weights[i];stones_values[index] = values[i];index++;}}vector<int> dp(C + 1, 0);for (int i = 0; i < stones_weights.size(); i++) {for (int j = C; j >= stones_weights[i]; j--) {dp[j] = max(dp[j], dp[j - stones_weights[i]] + stones_values[i]);}}cout << dp[C] << endl;
}

背包问题总结

文档讲解:代码随想录

按背包类型分类:01背包、完全背包、多重背包等。

  • 01背包:遍历背包时从后向前遍历
  • 完全背包:遍历背包时从前向后遍历
  • 多重背包:将物品展开转换为01背包问题

按所求问题分类:能否装满背包,背包最多装多少,装满背包有多少种方法,背包装满最大价值,装满背包所需最小物品数。

  • 能否装满背包:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]),即01背包问题中价值和重量相同,装完背包后,最大价值与背包容量相同则可以装满背包。
  • 背包最多装多少:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]),即01背包问题中价值和重量相同。
  • 装满背包有多少种方法:dp[j] += dp[j - nums[i]]。
  • 背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])。
  • 装满背包所需最小物品数:dp[j] = min(dp[j], dp[j - nums[i]] + 1)。

遍历顺序

  • 求组合数:外层循环遍历物品,内层循环遍历背包。
  • 求排列数:外层循环遍历背包,内层循环遍历物品。

这篇关于代码随想录算法训练营第四十六天|139.单词拆分,多重背包,背包问题总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983268

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地