算法系列--动态规划--背包问题(5)--二维费用背包问题(下)

简介: 算法系列--动态规划--背包问题(5)--二维费用背包问题(下)

算法系列--动态规划--背包问题(5)--二维费用背包问题(上)

https://developer.aliyun.com/article/1480864?spm=a2c6h.13148508.setting.14.5f4e4f0e82l87T

💕"要平安无事地活下去."💕

作者:Lvzi

文章主要内容:算法系列–动态规划–背包问题(5)–二维费用背包问题

大家好,今天为大家带来的是算法系列--动态规划--背包问题(5)--二维费用背包问题

二.盈利计划

链接:

https://leetcode.cn/problems/profitable-schemes/description/

分析:

本题有两个限制条件:

  1. 总人数不能超过n
  2. 总价格必须 >= minProfit

同样的也是一个二维费用的背包问题,分析思路同上,需要注意的是这里要求的是一共有多少种情况数,所以注意不选也是一种情况

状态表示:

  • dp[i][j][k]:在前i个物品中选择,总人数不超过j,总利润至少为k,一共有多少种选法

状态转移方程:

注意这里的总利润是至少为k,不是最多,k-p[i]可以小于0,如果小于0,就代表p[i]>k,也就是只要完成第i个任务就可以达到最小的利润,之前的所有任务我不选都行,但是在数组中下标不能为负数,所以当k-p[i] < 0时,应该直接当做总利润至少0的情况

代码:

class Solution {
    public int profitableSchemes(int n, int minProfit, int[] group, int[] profit) {
        int len = group.length, MOD = (int)1e9 + 7;// MOD是为了防止数据过大造成越界
        int[][][] dp = new int[len + 1][n + 1][minProfit + 1];
        for(int j = 0 ; j <= n; j++) dp[0][j][0] = 1;
        for(int i = 1; i <= len; i++) {
            for(int j = 0; j <= n; j ++) {
                for(int k = 0; k <= minProfit; k++) {
                    dp[i][j][k] = dp[i - 1][j][k];
                    if(j >= group[i - 1])
                        dp[i][j][k] += dp[i - 1][j - group[i - 1]][Math.max(0, k - profit[i - 1])];
                    dp[i][j][k] %= MOD;// 防止越界
                }
            }
        }
        return dp[len][n][minProfit];
    }
}

空间优化代码:

class Solution {
    public int profitableSchemes(int n, int minProfit, int[] group, int[] profit) {
        int len = group.length, MOD = (int)1e9 + 7;// MOD是为了防止数据过大造成越界
        int[][] dp = new int[n + 1][minProfit + 1];
        for(int j = 0 ; j <= n; j++) dp[j][0] = 1;
        for(int i = 1; i <= len; i++) {
            for(int j = n; j >= group[i - 1]; j--) {
                for(int k = minProfit; k >= 0; k--) {
                    dp[j][k] += dp[j - group[i - 1]][Math.max(0, k - profit[i - 1])];
                    dp[j][k] %= MOD;// 防止越界
                }
            }
        }
        return dp[n][minProfit];
    }
}

总结:

  • 二维费用的背包问题其实多一维的背包问题,区别就在于dp表是一个三维的dp表,但是思路和普通的背包问题类似,遵循相同的状态表示,状态转移方程,填表顺序,以及空间优化
  • 二位费用背包问题相较于普通的背包问题更加灵活,比如第二个题目中不再是不超过xxxx,而是至少实现最低利润


目录
相关文章
|
3月前
|
算法 开发者 Python
惊呆了!Python算法设计与分析,分治法、贪心、动态规划...这些你都会了吗?不会?那还不快来学!
【7月更文挑战第10天】探索编程巅峰,算法至关重要。Python以其易读性成为学习算法的首选。分治法,如归并排序,将大问题拆解;贪心算法,如找零问题,每步求局部最优;动态规划,如斐波那契数列,利用子问题解。通过示例代码,理解并掌握这些算法,提升编程技能,面对挑战更加从容。动手实践,体验算法的神奇力量吧!
62 8
|
2月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
2月前
|
算法 Java 测试技术
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
这篇文章介绍了基于动态规划法的三种算法:解决背包问题的递归和自底向上实现、Warshall算法和Floyd算法,并提供了它们的伪代码、Java源代码实现以及时间效率分析。
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
|
3月前
|
算法 Python
Python算法高手进阶指南:分治法、贪心算法、动态规划,掌握它们,算法难题迎刃而解!
【7月更文挑战第10天】探索Python算法的精华:分治法(如归并排序)、贪心策略(如找零钱问题)和动态规划(解复杂问题)。通过示例代码揭示它们如何优化问题解决,提升编程技能。掌握这些策略,攀登技术巅峰。
72 2
|
3月前
|
算法 程序员 Python
算法小白到大神的蜕变之路:Python分治法、贪心、动态规划,一步步带你走向算法巅峰!
【7月更文挑战第9天】探索算法之旅,以Python解锁编程高手之路。分治法如二分查找,将复杂问题拆解;贪心算法解决活动选择,每次选取局部最优;动态规划求斐波那契数列,避免重复计算,实现全局最优。每一步学习,都是编程能力的升华,助你应对复杂挑战,迈向算法大师!
37 1
|
1天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
28天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
28天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
29天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
1月前
|
算法
基于SIR模型的疫情发展趋势预测算法matlab仿真
该程序基于SIR模型预测疫情发展趋势,通过MATLAB 2022a版实现病例增长拟合分析,比较疫情防控力度。使用SIR微分方程模型拟合疫情发展过程,优化参数并求解微分方程组以预测易感者(S)、感染者(I)和移除者(R)的数量变化。![]该模型将总人群分为S、I、R三部分,通过解析或数值求解微分方程组预测疫情趋势。
下一篇
无影云桌面