-
Notifications
You must be signed in to change notification settings - Fork 820
/
ProfitableSchemes.java
70 lines (68 loc) · 2.58 KB
/
ProfitableSchemes.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/* (C) 2024 YourCompanyName */
package dynamic_programming;
/**
* Created by gouthamvidyapradhan on 26/03/2019 There are G people in a gang, and a list of various
* crimes they could commit.
*
* <p>The i-th crime generates a profit[i] and requires group[i] gang members to participate.
*
* <p>If a gang member participates in one crime, that member can't participate in another crime.
*
* <p>Let's call a profitable scheme any subset of these crimes that generates at least P profit,
* and the total number of gang members participating in that subset of crimes is at most G.
*
* <p>How many schemes can be chosen? Since the answer may be very large, return it modulo 10^9 + 7.
*
* <p>Example 1:
*
* <p>Input: G = 5, P = 3, group = [2,2], profit = [2,3] Output: 2 Explanation: To make a profit of
* at least 3, the gang could either commit crimes 0 and 1, or just crime 1. In total, there are 2
* schemes. Example 2:
*
* <p>Input: G = 10, P = 5, group = [2,3,5], profit = [6,7,8] Output: 7 Explanation: To make a
* profit of at least 5, the gang 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).
*
* <p>Note:
*
* <p>1 <= G <= 100 0 <= P <= 100 1 <= group[i] <= 100 0 <= profit[i] <= 100 1 <= group.length =
* profit.length <= 100
*
* <p>Solution: O(G x P) Time and Space complexity. The problem is similar to the standard Knapsack
* DP problem. For every group value (ranging from 0 - 100) if a minimum of profit can be achieved
* then add this to the total count. Sum up the count (profitable schemes) for every group value
* ranging from 0 - G and return this as your answer.
*/
public class ProfitableSchemes {
private final int MOD = 1000000007;
/**
* Main method
*
* @param args
*/
public static void main(String[] args) {
int[] group = {2, 3};
int[] profit = {2, 5};
System.out.println(new ProfitableSchemes().profitableSchemes(5, 2, group, profit));
}
public int profitableSchemes(int G, int P, int[] group, int[] profit) {
int[][] DP = new int[G + 1][P + 1];
int ans = 0;
DP[0][0] = 1;
for (int k = group.length - 1; k >= 0; k--) {
int g = group[k];
int p = profit[k];
for (int i = DP.length - 1; i >= 0; i--) {
for (int j = DP[0].length - 1; j >= 0; j--) {
int r1 = (i - g < 0) ? 0 : DP[i - g][Math.max(0, j - p)];
int r2 = DP[i][j];
DP[i][j] = ((r1 % MOD) + (r2 % MOD)) % MOD;
}
}
}
for (int i = 0; i < DP.length; i++) {
ans = (ans + DP[i][P]) % MOD;
}
return ans;
}
}