代码随想录算法训练营第三十四天| 研究携带材料、416. 分割等和子集

题目链接:携带研究材料

解题思路:动态规划(二维)

具体思路:

首先读取物品数量 m 和背包容量 n,再分别读取 m 个物品的重量数组 weight 和价值数组value,接着初始化一个 m * (n + 1) 的二维 dp 数组,dp[i][j] 表示前 i + 1个物品放入容量为j的背包能获得的最大价值,并初始化第一行当背包容量 j 大于等于第一个物品重量时,dp[0][j] 赋值为第一个物品的价值,然后通过双层循环遍历剩余物品和所有容量,若当前容量 j 小于第 i 个物品重量,则无法放入该物品,dp[i][j] 等于上一行同列的值,即不选该物品的最大价值,否则取不选该物品dp[i - 1][j] 和选该物品dp[i - 1][j - weight[i]] + value[i]中的较大值更新dp[i][j],最终输出dp[m - 1][n],即所有物品放入容量为 n 的背包能获得的最大价值。

具体代码:

#include<iostream> #include<vector> using namespace std; int main () { int m; int n; cin >> m >> n; vector<int> weight(m, 0); vector<int> value(m, 0); for (int i = 0; i < m; i++) cin >> weight[i]; for (int i = 0; i < m; i++) cin >> value[i]; vector<vector<int>> dp(m, vector<int>(n + 1, 0)); for (int i = weight[0]; i <= n; i++) dp[0][i] = value[0]; for (int i = 1; i < m; i++) { for (int j = 0; j <= n; j++) { if (j < weight[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); } } cout << dp[m - 1][n]; return 0; }

时间复杂度:O(m * n)

空间复杂度:O(m * n)

解题思路:动态规划(一维)

具体思路:

首先读取物品数量 m 和背包容量 n,再分别读取 m 个物品的重量数组 weight 和价值数组value,接着初始化一个长度为  n + 1 的一维 dp 数组,dp[j] 表示容量为 j 的背包能装下的最大价值,初始值全为 0,然后通过双层循环遍历物品和背包容量,外层循环逐个遍历 m 个物品,内层循环从后往前遍历背包容量从 n 到当前物品重量 weight[i],这样能避免重复选取同一物品,对于每个容量 j ,取不选当前物品保持dp[j] 原值和选当前物品dp[j - weight[i]] + value[i],即容量 j - weight[i] 的最大价值加上当前物品价值中的较大值更新 dp[j],最终输出 dp[n] ,即容量为 n 的背包能获得的最大价值。

具体代码:

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

时间复杂度:O(m * n)

空间复杂度:O(n)

题目链接: 416. 分割等和子集

解题思路:动态规划(二维)

具体思路:

首先计算数组所有元素的总和,若总和为奇数则直接返回 false,无法分割为两个和相等的子集,若为偶数则将目标值 target 设为总和的一半,即需找到子集和为 target,接着初始化一个二维 dp 数组 dp[i][j] 表示前 i + 1 个元素中选取若干个,能组成的不超过 j 的最大和,并初始化第一行,当 j 大于等于第一个元素值时,dp[0][j] 赋值为该元素值,然后通过双层循环遍历剩余元素和所有可能的和,若当前 j 小于第 i 个元素值,则无法选取该元素, dp[i][j] 等于上一行同列值,否则取不选该元素 dp[i - 1][j] 和选该元素 dp[i - 1][j - nums[i]] + nums[i] 的较大值更新 dp[i][j] ,过程中若发现 dp[i][j] 等于 target 则提前返回 true,若遍历结束未找到则返回 false。

具体代码:

class Solution { public: bool canPartition(vector<int>& nums) { int sum = 0; for(int i = 0; i < nums.size(); i++) sum += nums[i]; if(sum % 2) return false; int target = sum / 2; vector<vector<int>> dp(nums.size(), vector<int>(target + 1, 0)); for (int j = 0; j <= target; j++) if (j >= nums[0]) dp[0][j] = nums[0]; for (int i = 1; i < nums.size(); i++) { for (int j = 1; j <= target; j++) { if (j < nums[i]) dp[i][j] = dp[i - 1][j]; else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]); if (dp[i][j] == target) return true; } } return false; } };

时间复杂度:O(n * target)

空间复杂度:O(n * target)

解题思路:动态规划(一维)

具体思路:

首先计算数组所有元素的总和,若总和为奇数则直接返回 false,无法分割为两个和相等的子集,若为偶数则将目标值 target 设为总和的一半,即需找到子集和为 target,接着初始化长度为 target + 1的一维 dp 数组 dp[j] 表示选取若干元素能组成的不超过 j 的最大和,初始值全为 0,然后通过双层循环遍历数组元素和目标和,外层逐个遍历数组元素,内层从后往前遍历 target 到当前元素值避免重复选取同一元素,对每个 j 取不选当前元素保持 dp[j] 原值和选当前元素 dp[j - nums[i]] + nums[i] 的较大值更新 dp[j] ,过程中若发现 dp[target] 等于 target 则提前返回 true,若遍历结束未满足条件则返回 false。

具体代码:

class Solution { public: bool canPartition(vector<int>& nums) { int sum = 0; for (int i = 0; i < nums.size(); i++) sum += nums[i]; if (sum % 2) return false; int target = sum / 2; vector<int> dp(target + 1, 0); for (int i = 0; i < nums.size(); i++) { for (int j = target; j >= nums[i]; j--) { dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]); if (dp[target] == target) return true; } } return false; } };

时间复杂度:O(n * target)

空间复杂度:O(target)

Read more

10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?

文章目录 * 一、引言 * 云计算平台概览 * ToDesk云电脑:随时随地用上高性能电脑 * 二 .云电脑初体验 * DeekSeek介绍 * 版本参数与特点 * 任务类型表现 * 1、ToDesk云电脑 * 2、顺网云电脑 * 3、海马云电脑 * 三、DeekSeek本地化实操和AIGC应用 * 1. ToDesk云电脑 * 2. 海马云电脑 * 3、顺网云电脑 * 四、结语 * 总结:云电脑如何选择? 一、引言 DeepSeek这些大模型让 AI 开发变得越来越有趣,但真要跑起来,可没那么简单! * 本地配置太麻烦:显卡不够、驱动难装、环境冲突,光是折腾这些就让人心态崩了。 * 云端性能参差不齐:选错云电脑,可能卡到爆、加载慢,还容易掉线,搞得效率直线下降。 * 成本难控:有的平台按小时计费,价格一会儿一个样,

By Ne0inhk
用 DeepSeek 打造你的超强代码助手

用 DeepSeek 打造你的超强代码助手

DeepSeek Engineer 是啥? 简单来说,DeepSeek Engineer 是一个基于命令行的智能助手。它能帮你完成这些事: * 快速读文件内容:比如你有个配置文件,直接用命令把它加载进助手,后续所有操作都可以基于这个文件。 * 自动改文件:它不仅能提建议,还可以直接生成差异表(diff),甚至自动应用修改。 * 智能代码生成:比如你让它生成代码片段,它会按照指定格式和规则直接返回。 更重要的是,这一切都是通过 DeepSeek 的强大 API 来实现的。想象一下,你有个贴身助手,不仅能听懂你的代码需求,还能直接动手帮你写! 核心功能拆解 我们先来看 DeepSeek Engineer 的几个核心能力,让你更好地理解它的强大之处。 1. 自动配置 DeepSeek 客户端 启动这个工具时,你只需要准备一个 .env 文件,里面写上你的 API Key,比如: DEEPSEEK_API_

By Ne0inhk
解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式

解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式

🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Docker 2、什么是Ollama 二、准备工作 1、操作系统 2、镜像准备 三、安装 1、安装Docker 2、启动Ollama 3、拉取Deepseek大模型 4、启动Deepseek  一、引言 1、什么是Docker Docker:就像一个“打包好的App” 想象一下,你写了一个很棒的程序,在自己的电脑上运行得很好。但当你把它发给别人,可能会遇到各种问题: * “这个软件需要 Python 3.8,但我只有 Python 3.6!

By Ne0inhk
深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本

深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本

前引:屏幕前的你还在AI智能搜索框这样搜索吗?“这道题怎么写”“苹果为什么红”“怎么不被发现翘课” ,。看到此篇文章的小伙伴们!请准备好你的思维魔杖,开启【霍格沃茨模式】,看我如何更新秘密的【知识炼金术】,我们一起来解锁更加刺激的剧情!友情提醒:《《《前方高能》》》 目录 在哪使用DeepSeek 如何对提需求  隐藏玩法总结 几个高阶提示词 职场打工人 自媒体创作 电商实战 程序员开挂 非适用场地 “服务器繁忙”如何解决 (1)硅基流动平台 (2)Chatbox + API集成方案 (3)各大云平台 搭建个人知识库 前置准备 下载安装AnythingLLM 选择DeepSeek作为AI提供商 创作工作区 导入文档 编辑  编辑 小编寄语 ——————————————————————————————————————————— 在哪使用DeepSeek 我们解锁剧情前,肯定要知道在哪用DeepSeek!咯,为了照顾一些萌新朋友,它的下载方式我放在下面了,拿走不谢!  (1)

By Ne0inhk