【Day44】879. 盈利计划

879. 盈利计划

集团里有 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

题解:

这题不会,贴一个题解吧

class Solution {
public:
    int profitableSchemes(int n, int minProfit, vector& group, vector& profit) {
        int mod = 1e9 + 7;
        int size = group.size();
        int dp[n + 1][minProfit + 1];
        memset(dp, 0, sizeof(dp));
        for (int i = 0; i <= n; ++i) {
            dp[i][0] = 1;
        }

        for (int i = 1; i <= size; ++i) {
            int cur_group = group[i - 1], cur_profit = profit[i - 1];
            for (int j = n; j >= cur_group; --j) {
                for (int k = minProfit; k >= 0; --k) {
                    dp[j][k] += dp[j - cur_group][max(k - cur_profit, 0)];
                    dp[j][k] %= mod;
                }
            }
        }
        return dp[n][minProfit];
    }
};

   转载规则


《【Day44】879. 盈利计划》 Tyzhao 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
【Day45】518. 零钱兑换 II 【Day45】518. 零钱兑换 II
518. 零钱兑换 II给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount = 5, coins = [1, 2, 5] 输出: 4 解释: 有四种方
2021-06-10
下一篇 
【Day43】1049. 最后一块石头的重量 II 【Day43】1049. 最后一块石头的重量 II
1049. 最后一块石头的重量 II有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <=
2021-06-08
  目录