算法系列--动态规划--背包问题(2)--01背包拓展题目(下)

简介: 算法系列--动态规划--背包问题(2)--01背包拓展题目(下)

算法系列--动态规划--背包问题(2)--01背包拓展题目(上)

https://developer.aliyun.com/article/1480847?spm=a2c6h.13148508.setting.14.5f4e4f0ehtknjw

💕"2024.3.28小米汽车发布"💕

作者:Lvzi

文章主要内容:算法系列–动态规划–背包问题(2)–01背包拓展题目

大家好,今天为大家带来的是算法系列--动态规划--背包问题(2)--01背包拓展题目

  1. 状态表示:
  • dp[i][j] :nums在[1,i]区间数字,和为j的最大组合数
  1. 状态转移方程
  • 和经典的背包问题一样,也是根据最后一个位置选或不选来推导状态转移方程,要注意的是,本题求的是最大组合数,也就是dp[i][j]应该是两种情况的总和
  1. 初始化
  • 初始化主要考虑第一行和第一列
  1. 填表顺序
  • 从左往右,从上往下
  1. 返回值
  • dp[n][a]

代码:

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int a = 0, sum = 0;
        for(int n : nums) sum += n;// 求和
        a = (target + sum) / 2;// 计算目标值
        if(a < 0 || (sum + target) % 2 == 1) return 0;
        // 创建dp表
        int n = nums.length;
        int[][] dp = new int[n + 1][a + 1];
        dp[0][0] = 1;
        // 填表
        for(int i = 1; i <= n; i++) {
            for(int j = 0; j <= a; j++) {
                dp[i][j] = dp[i - 1][j];
                if(j - nums[i - 1] >= 0)
                    dp[i][j] += dp[i - 1][j - nums[i - 1]];
            }
        }
        return dp[n][a];
    }
}

空间优化后的代码

class Solution {
    public int findTargetSumWays(int[] nums, int target) {
        int a = 0, sum = 0;
        for(int n : nums) sum += n;// 求和
        a = (target + sum) / 2;// 计算目标值
        if(a < 0 || (sum + target) % 2 == 1) return 0;
        // 创建dp表
        int n = nums.length;
        int[] dp = new int[a + 1];
        dp[0] = 1;
        // 填表
        for(int i = 1; i <= n; i++)
            for(int j = a; j >= nums[i - 1]; j--)// 注意优化后的便利顺序
                dp[j] += dp[j - nums[i - 1]];
        return dp[a];
    }
}

第一行不初始化,放到填表之中,也是背包问题常用的一种优化手段

3.最后⼀块⽯头的重量II

链接:

https://leetcode.cn/problems/last-stone-weight-ii/description/

分析:

本题的难点就在于转化,光看数字无法得出什么有效的结论,我们将数字换为字母,看能得出什么结论:

最后发现整个问题的思路很像目标和那道题目(就在上面),但是目标和那道题目最终求的是一个具体数字,本题要求的是最后的值的绝对值尽可能的小,还是套用和目标和一样的分析思路,整个数组的和是sum,可以根据匹配的符号不同分为两部分a,b

假设a>b,则求得就是a-b的最小值,对于数组中的每一个数都是选或不选,这就是01背包问题的特征,可以使用01背包问题的思路解决

状态表示:

  • dp[i][j]:在[1,i]区间内,选取一定的数字,在不超过j的前提下,可以实现的最大和

状态转移方程和初始化都比较简单,这里不再赘述

返回值:

  • 最终返回的应该是a-b的最小值a = dp[n][sum/2],那么b = sum - a,所以最终应该返回sum - 2 * dp[n][sum/2]
class Solution {
    public int lastStoneWeightII(int[] stones) {
        int n = stones.length, sum = 0;
        for(int x : stones) sum += x;
        int[][] dp = new int[n + 1][sum/2 + 1];// 创建dp表
        // 填表
        for(int i = 1; i <= n; i++) {
            for(int j = 0; j <= sum/2; j++) {
                dp[i][j] = dp[i - 1][j];
                if(j - stones[i - 1] >= 0)
                    dp[i][j] = Math.max(dp[i][j],dp[i - 1][j - stones[i - 1]] + stones[i - 1]);
            }
        }
        return sum - 2 * dp[n][sum/2];// 返回(a-b)绝对值的最小值
    }
}

空间优化后的代码:

class Solution {
    public int lastStoneWeightII(int[] stones) {
        int n = stones.length, sum = 0;
        for(int x : stones) sum += x;
        
        int[] dp = new int[sum/2 + 1];// 创建dp表
        // 填表
        for(int i = 1; i <= n; i++)
            for(int j = sum/2; j >= stones[i-1]; j--) 
                dp[j] = Math.max(dp[j],dp[j - stones[i - 1]] + stones[i - 1]);
        return sum - 2 * dp[sum/2];// 返回(a-b)绝对值的最小值
    }
}

以上就是算法系列--动态规划--背包问题(2)--01背包拓展题目全部内容,下一篇文章将会带来完全背包问题的介绍,敬请期待,我是LvZi


目录
相关文章
|
2月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
65 2
|
3月前
|
算法
动态规划算法学习三:0-1背包问题
这篇文章是关于0-1背包问题的动态规划算法详解,包括问题描述、解决步骤、最优子结构性质、状态表示和递推方程、算法设计与分析、计算最优值、算法实现以及对算法缺点的思考。
120 2
动态规划算法学习三:0-1背包问题
|
3月前
|
算法
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
这篇文章介绍了动态规划算法中解决最大上升子序列问题(LIS)的方法,包括问题的描述、动态规划的步骤、状态表示、递推方程、计算最优值以及优化方法,如非动态规划的二分法。
85 0
动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)
|
12天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
145 80
|
6天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
8天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
5天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
9天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
3天前
|
算法 5G
基于MSWA相继加权平均的交通流量分配算法matlab仿真
本项目基于MSWA(Modified Successive Weighted Averaging)相继加权平均算法,对包含6个节点、11个路段和9个OD对的交通网络进行流量分配仿真。通过MATLAB2022A实现,核心代码展示了迭代过程及路径收敛曲线。MSWA算法在经典的SUE模型基础上改进,引入动态权重策略,提高分配结果的稳定性和收敛效率。该项目旨在预测和分析城市路网中的交通流量分布,达到用户均衡状态,确保没有出行者能通过改变路径减少个人旅行成本。仿真结果显示了27条无折返有效路径的流量分配情况。
|
1月前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。

热门文章

最新文章