本文主要是介绍LeetCode879. Profitable Schemes——动态规划,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、题目
- 二、题解
一、题目
There is a group of n members, and a list of various crimes they could commit. The ith crime generates a profit[i] and requires group[i] members to participate in it. If a member participates in one crime, that member can’t participate in another crime.
Let’s call a profitable scheme any subset of these crimes that generates at least minProfit profit, and the total number of members participating in that subset of crimes is at most n.
Return the number of schemes that can be chosen. Since the answer may be very large, return it modulo 109 + 7.
Example 1:
Input: n = 5, minProfit = 3, group = [2,2], profit = [2,3]
Output: 2
Explanation: To make a profit of at least 3, the group could either commit crimes 0 and 1, or just crime 1.
In total, there are 2 schemes.
Example 2:
Input: n = 10, minProfit = 5, group = [2,3,5], profit = [6,7,8]
Output: 7
Explanation: To make a profit of at least 5, the group could commit any crimes, as long as they commit one.
There are 7 possible schemes: (0), (1), (2), (0,1), (0,2), (1,2), and (0,1,2).
Constraints:
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<int>& group, vector<int>& profit) {int mod = 1e9 + 7;vector<vector<int>> dp(n+1,vector<int>(minProfit+1,0));for(int r = 0;r <= n;r++){dp[r][0] = 1;}int m = group.size();for(int i = m - 1;i >= 0;i--){for(int r = n;r >= 0;r--){for(int s = minProfit;s >= 0;s--){int p1 = dp[r][s];int p2 = group[i] <= r ? dp[r-group[i]][max(0,s-profit[i])] : 0;dp[r][s] = (p1 + p2) % mod;}}}return dp[n][minProfit] % mod;}
};
这篇关于LeetCode879. Profitable Schemes——动态规划的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!