代码随想录算法训练营第三十四天| 研究携带材料、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

【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解

【AI大模型】DeepSeek + 通义万相高效制作AI视频实战详解

目录 一、前言 二、AI视频概述 2.1 什么是AI视频 2.2 AI视频核心特点 2.3 AI视频应用场景 三、通义万相介绍 3.1 通义万相概述 3.1.1 什么是通义万相 3.2 通义万相核心特点 3.3 通义万相技术特点 3.4 通义万相应用场景 四、DeepSeek + 通义万相制作AI视频流程 4.1 DeepSeek + 通义万相制作视频优势 4.1.1 DeepSeek 优势 4.1.2 通义万相视频生成优势 4.2

By Ne0inhk
【DeepSeek微调实践】DeepSeek-R1大模型基于MS-Swift框架部署/推理/微调实践大全

【DeepSeek微调实践】DeepSeek-R1大模型基于MS-Swift框架部署/推理/微调实践大全

系列篇章💥 No.文章01【DeepSeek应用实践】DeepSeek接入Word、WPS方法详解:无需代码,轻松实现智能办公助手功能02【DeepSeek应用实践】通义灵码 + DeepSeek:AI 编程助手的实战指南03【DeepSeek应用实践】Cline集成DeepSeek:开源AI编程助手,终端与Web开发的超强助力04【DeepSeek开发入门】DeepSeek API 开发初体验05【DeepSeek开发入门】DeepSeek API高级开发指南(推理与多轮对话机器人实践)06【DeepSeek开发入门】Function Calling 函数功能应用实战指南07【DeepSeek部署实战】DeepSeek-R1-Distill-Qwen-7B:本地部署与API服务快速上手08【DeepSeek部署实战】DeepSeek-R1-Distill-Qwen-7B:Web聊天机器人部署指南09【DeepSeek部署实战】DeepSeek-R1-Distill-Qwen-7B:基于vLLM 搭建高性能推理服务器10【DeepSeek部署实战】基于Ollama快速部署Dee

By Ne0inhk

DeepSeek各版本说明与优缺点分析_deepseek各版本区别

DeepSeek各版本说明与优缺点分析 DeepSeek是最近人工智能领域备受瞩目的一个语言模型系列,其在不同版本的发布过程中,逐步加强了对多种任务的处理能力。本文将详细介绍DeepSeek的各版本,从版本的发布时间、特点、优势以及不足之处,为广大AI技术爱好者和开发者提供一份参考指南。 1. DeepSeek-V1:起步与编码强劲 DeepSeek-V1是DeepSeek的起步版本,这里不过多赘述,主要分析它的优缺点。 发布时间: 2024年1月 特点: DeepSeek-V1是DeepSeek系列的首个版本,预训练于2TB的标记数据,主打自然语言处理和编码任务。它支持多种编程语言,具有强大的编码能力,适合程序开发人员和技术研究人员使用。 优势: * 强大编码能力:支持多种编程语言,能够理解和生成代码,适合开发者进行自动化代码生成与调试。 * 高上下文窗口:支持高达128K标记的上下文窗口,能够处理较为复杂的文本理解和生成任务。 缺点: * 多模态能力有限:该版本主要集中在文本处理上,缺少对图像、语音等多模态任务的支持。 * 推理能力较弱:尽管在自然语言

By Ne0inhk

用DeepSeek和Cursor从零打造智能代码审查工具:我的AI编程实践

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【星海网址导航】摸鱼、技术交流群👉 点此查看详情 引言:AI编程革命下的机遇与挑战 GitHub统计显示,使用AI编程工具的开发者平均效率提升55%,但仅有23%的开发者能充分发挥这些工具的潜力。作为一名全栈工程师,我曾对AI编程持怀疑态度,直到一次紧急项目让我彻底改变了看法。客户要求在72小时内交付一个能自动检测代码漏洞、优化性能的智能审查系统,传统开发方式根本不可能完成。正是这次挑战,让我探索出DeepSeek和Cursor这对"黄金组合"的惊人潜力。 一、工具选型:深入比较主流AI编程工具 1.1 为什么最终选择DeepSeek+Cursor? 经过两周的对比测试,我们发现不同工具在代码审查场景的表现差异显著: 工具代码理解深度响应速度定制灵活性多语言支持GitHub Copilot★★★☆★★★★★★☆★★★★Amazon CodeWhisperer★★☆★★★☆★★★★★★☆DeepSeek★★★★☆★★★★★★★☆★★★★☆Cursor★★★☆★★★★☆★★★★★★★★ 关键发现: * Dee

By Ne0inhk