《背包问题:C++ 中的“资源分配”与“空间压缩”》 你是一个货车司机CPU车斗容量有限背包容量。货场里有一堆货物物品每个货物有重量和价值。你的目标是在不超重的前提下装下价值最高的货物组合。模块一0-1 背包标准二维版1. 思路讲解定义dp[i][w]考虑前i件物品背包容量为w时能装的最大价值。对于第i件物品面临两个选择不装dp[i][w] dp[i-1][w]价值继承上一轮。装dp[i][w] dp[i-1][w-weight[i]] value[i]腾出空间加上价值。取两者最大值。2. 代码详解cppcpp#include vector #include algorithm using namespace std; class Solution { public: int knapsack(int N, int W, vectorint wt, vectorint val) { // dp[i][w]: 前i个物品容量w下的最大价值 vectorvectorint dp(N 1, vectorint(W 1, 0)); for (int i 1; i N; i) { // 遍历物品 for (int w 1; w W; w) { // 遍历容量 // 如果当前物品重量超过当前背包容量没法装 if (wt[i - 1] w) { dp[i][w] dp[i - 1][w]; } else { // 核心装 vs 不装 dp[i][w] max( dp[i - 1][w], // 不装 dp[i - 1][w - wt[i - 1]] val[i - 1] // 装 ); } } } return dp[N][W]; } };C 细节wt[i-1]是因为数组下标从 0 开始而 DP 下标从 1 开始为了省去初始化第 0 行的麻烦。模块二0-1 背包一维优化版 - 滚动数组1. 思路讲解观察二维 DP 表发现dp[i][...]只依赖于dp[i-1][...]。我们可以将二维压缩为一维dp[w]。关键难点为什么容量w必须倒序遍历如果正序遍历dp[w-weight[i]]可能已经被本轮第 i 个物品更新过了这就变成了“完全背包”物品可重复选取。倒序遍历能保证dp[w-weight[i]]一定是上一轮i-1的数据。2. 代码详解cppcppclass Solution { public: int knapsack(int N, int W, vectorint wt, vectorint val) { vectorint dp(W 1, 0); // 一维数组 for (int i 0; i N; i) { // 遍历物品 // 关键倒序遍历容量防止数据污染 for (int w W; w wt[i]; w--) { // dp[w] 相当于二维的 dp[i-1][w] // dp[w-wt[i]] 相当于二维的 dp[i-1][w-wt[i]] dp[w] max(dp[w], dp[w - wt[i]] val[i]); } } return dp[W]; } };口诀“0-1 背包倒着走完全背包顺着走”。模块三分割等和子集背包思想的应用1. 思路讲解能不能将一个数组分成两个和相等的子数组转化为能不能从数组中挑选一些数使得它们的和恰好等于sum/2。这是一个“背包容量为 sum/2物品重量为 nums[i]价值也为 nums[i]”​ 的 0-1 背包问题。2. 代码详解cppcppclass Solution { public: bool canPartition(vectorint nums) { int sum 0; for (int num : nums) sum num; if (sum % 2 ! 0) return false; // 奇数不可能平分 int target sum / 2; vectorbool dp(target 1, false); dp[0] true; // 什么都不选和为0永远成立 for (int num : nums) { // 遍历物品 // 遍历容量倒序0-1背包特性 for (int j target; j num; j--) { // 如果减去当前num剩下的重量能被凑出来那当前重量也能被凑出来 dp[j] dp[j] || dp[j - num]; } } return dp[target]; } };思路dp[j]是布尔类型表示能否凑出和为j。这里使用了逻辑或||。谢谢

相关新闻

最新新闻

《冰雪传奇点卡版》正版官网下载指南,冰雪传奇点卡版全网最新官网下载渠道

《冰雪传奇点卡版》正版官网下载指南,冰雪传奇点卡版全网最新官网下载渠道

如今冰雪系列传奇手游版本参差不齐,大量私自调低装备爆率、暗藏隐形消费的魔改服遍地都是,很多传奇老玩家很难找到原汁原味的冰雪传奇点卡版。本文围绕冰雪传奇点卡版正版下载、忆东怀旧手游两大核心关键词,结合纯时长计费模式、转生进阶、战…

2026/7/11 3:00:41
Mistral Leanstral 1.5:专为数学定理证明优化的AI模型部署指南

Mistral Leanstral 1.5:专为数学定理证明优化的AI模型部署指南

今天来看一个专门为数学形式化证明设计的开源模型——Mistral AI发布的Leanstral 1.5。这个模型最大的特点是专注于Lean 4工作流程,能够协助完成数学定理和软件规格的形式化证明任务,而不是通用的代码生成。Leanstral 1.5采用稀疏MoE架构,支持…

2026/7/11 3:00:41
实验7.1

实验7.1

实验7-1 自媒体运营分析——数据清洗与预处理实验报告 一、实验目的本次实验依托全体学生多平台自媒体作品互动数据集,借助助睿ETL工具完成整套数据清洗与预处理操作,生成两份标准业务数据表,为后续特征工程、可视化分析提供规范数据源。完成…

2026/7/11 3:00:41
VBA信息获取与处理专题七第二节  网络通信过程的解读

VBA信息获取与处理专题七第二节 网络通信过程的解读

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

2026/7/11 3:00:41
ShaderGraph Keyword节点:静态分支管理与多状态材质实现

ShaderGraph Keyword节点:静态分支管理与多状态材质实现

1. 项目概述:ShaderGraph中的“开关”艺术在ShaderGraph的世界里,我们常常需要制作一个能应对多种情况的“变色龙”着色器。比如,一个角色材质,白天是布纹质感,夜晚要能自发光;一件装备,普通状态…

2026/7/11 3:00:41
虚拟滚动列表深度解析

虚拟滚动列表深度解析

一、问题:为什么需要虚拟滚动当一个列表需要渲染 成百上千条数据 时,传统的 v-for 全量渲染方案会创建等量的 DOM 节点。假设每条列表项高度 120px、包含 10 个子元素,1000 条数据就意味着 10,000 个 DOM 节点。大量 DOM 节点带来的性能问题包…

2026/7/11 2:55:41

月新闻