这是我参与更文挑战的第9天
,活动详情查看更文挑战

题目

集团里有 n 名员工,他们可以完成各种各样的工作创造利润。

第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与。如果成员参与了其中一项工作,就不能参与另一项工作。

工作的任何至少产生 minProfit 利润的子集称为 盈利计划 。并且工作的成员总数最多为 n 。

有多少种计划可以选择?因为答案很大,所以 返回结果模 10^9 + 7 的值。

示例 1:

输入:n = 5, minProfit = 3, group = [2,2], profit = [2,3]
输出:2
解释:至少产生 3 的利润,该集团可以完成工作 0 和工作 1 ,或仅完成工作 1 。
总的来说,有两种计划。
示例 2:

输入:n = 10, minProfit = 5, group = [2,3,5], profit = [6,7,8]
输出:7
解释:至少产生 5 的利润,只要完成其中一种工作就行,所以该集团可以完成任何工作。
有 7 种可能的计划:(0),(1),(2),(0,1),(0,2),(1,2),以及 (0,1,2) 。

提示:

  • 1 <= n <= 100
  • 0 <= minProfit <= 100
  • 1 <= group.length <= 100
  • 1 <= group[i] <= 100
  • profit.length == group.length
  • 0 <= profit[i] <= 100

解题思路

数组含义

dp[i][j][k]表示前i份工作,j名员工,利润至少为k的情况下,计划的数量

状态转移

  • j>=group[i]表示当前人员充足,可以承接这个任务,所以可以选择是否接受该任务
 dp[i+1][j][k]=(dp[i][j][k]+dp[i][j-group[i]][Math.max(0,k-profit[i])])%mod;

因为第三维代表的是利润至少为k的情况,所以k-profit[i]可能为负数,因此需要赋值为0

  • j<group[i]表示当前人员不够,不能承接这个任务
    dp[i+1][j][k]=dp[i][j][k];

代码

class Solution {public int profitableSchemes(int n, int minProfit, int[] group, int[] profit) {int m=profit.length,mod=(int) 1e9+7;int[][][] dp = new int[m+1][n+1][minProfit+1];dp[0][0][0]=1;for (int i=0;i<m;i++){for (int j=0;j<=n;j++){for (int k=0;k<=minProfit;k++) {if(j>=group[i]){dp[i+1][j][k]=(dp[i][j][k]+dp[i][j-group[i]][Math.max(0,k-profit[i])])%mod;}else {dp[i+1][j][k]=dp[i][j][k];}}}}int res=0;for (int j=0;j<=n;j++){res=(res+dp[m][j][minProfit])%mod;}return res;}
}

leetcode 879. 盈利计划(dp)相关推荐

  1. LeetCode 879. 盈利计划

    879. 盈利计划 本题与经典背包问题非常相似.两者不同点在于经典背包问题只有一种容量限制,而本题却有两种限制:集团员工人数上限 n,以及工作产生的利润下限 minProfit. 通过经典背包问题的练 ...

  2. LeetCode 879. 盈利计划(动态规划)

    文章目录 1. 题目 2. 解题 1. 题目 集团里有 n 名员工,他们可以完成各种各样的工作创造利润. 第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与.如 ...

  3. LeetCode 编辑距离 II(DP)

    1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...

  4. LeetCode 72. 编辑距离(DP)

    1. 题目 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示 ...

  5. Leetcode之动态规划(DP)专题-1025. 除数博弈(Divisor Game)

    Leetcode之动态规划(DP)专题-1025. 除数博弈(Divisor Game) 爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需 ...

  6. LeetCode 1335. 工作计划的最低难度(DP)

    1. 题目 你需要制定一份 d 天的工作计划表.工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0 <= j < i). 你每天 至少 需要完成一项任务.工作计划的 ...

  7. LeetCode 2008. 出租车的最大盈利(DP)

    文章目录 1. 题目 2. 解题 1. 题目 你驾驶出租车行驶在一条有 n 个地点的路上. 这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n ,通过接乘客订单盈利. 你只能沿着编号递 ...

  8. LeetCode 198. 打家劫舍(DP)

    1. 题目 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给 ...

  9. LeetCode 1176. 健身计划评估(滑动窗口)

    文章目录 1. 题目 2. 解题 1. 题目 你的好友是一位健身爱好者.前段日子,他给自己制定了一份健身计划.现在想请你帮他评估一下这份计划是否合理. 他会有一份计划消耗的卡路里表,其中 calori ...

最新文章

  1. 20 亿个数字在 4G 内存中如何去重排序:快来试一试 BitMap
  2. python爬虫兼职-python爬虫爬取拉勾招聘网
  3. Silverlight 3 Tools 中文版地址
  4. gulp自动化构建工具--压缩css--学习笔记
  5. kaggle入门竞赛之泰坦尼克事故存活预测(xgboost方法)
  6. 直线电机原理动画_最新的3D动画演示:同步电机原理及技术,一般人看不懂
  7. mui 与jquery 同时使用,$冲突解决办法。
  8. 如何选择使用结构或类
  9. springboot 统一异常处理
  10. Python Cookbook手记II
  11. java执行Sql脚本
  12. 蓝桥杯国赛【机器人行走】 Python
  13. 一行代码实现curry化
  14. 【DCANet2022】:DCANet: Differential Convolution Attention Network for RGB-D Semantic Segmentation
  15. BSOJ2923 CODEVS1419 藤原妹红 最小生成树+树形dp
  16. U3D -- 一些知识点和优秀博客收藏
  17. 解决办法:git错误 error: failed to push some refs to 'https://github.com/...
  18. Mysql主从同步记录
  19. 每天学一点英文:Espresso 20210903
  20. CAD与Gerber的差别有哪些?带你了解一下

热门文章

  1. 线程间通信————同步
  2. 非阻塞connect
  3. java特性多态,90%的人看完都说好
  4. 疯狂涨知识!Java多态实现原理技术总监都拍手叫好
  5. 35. 搜索插入位置-LeetCode
  6. Activity跳转
  7. JS,JQuery杂谈
  8. CentOS HarBor安装与配置
  9. 本文将引导你使用XNA Game Studio Express一步一步地创建一个简单的游戏
  10. 跟随我在oracle学习php(21)