Problem Statement |
||||||||||||
Your master construction unit can build 1 unit of type 0 in times[0] seconds at a cost of costs[0]. Each unit of type 0, once built, can in turn build 1 unit of type 1 in times[1] seconds at a cost of costs[1]. Type 1 units can build units of type 2, and so forth. Let N denote the number of elements in times. Given totTime seconds, return the greatest number of units of type N-1 that can be created without exceeding a total cost of totCost. | ||||||||||||
Definition |
||||||||||||
|
||||||||||||
Constraints |
||||||||||||
- | costs will contain between 2 and 50 elements, inclusive. | |||||||||||
- | times will contain the same number of elements as costs. | |||||||||||
- | Each element of costs will be between 1 and 100, inclusive. | |||||||||||
- | Each element of times will be between 1 and 100, inclusive. | |||||||||||
- | totTime will be between 1 and 100, inclusive. | |||||||||||
- | totCost will be between 1 and 100, inclusive. | |||||||||||
Examples |
||||||||||||
0) | ||||||||||||
|
||||||||||||
1) | ||||||||||||
|
||||||||||||
2) | ||||||||||||
|
||||||||||||
3) | ||||||||||||
|
||||||||||||
4) | ||||||||||||
|
import java.util.Arrays; public class ProductionOptimization { int[][][] dp = new int[64][128][128]; int[] costs, times; int solve(int i, int c, int t) { if (dp[i][c][t] != -1) return dp[i][c][t]; if (i == costs.length) return 1; int c2 = c - costs[i]; int t2 = t - times[i]; if (c2 < 0 || t2 < 0) return 0; int ret = 0; for (int k = 0; k <= c2; k++) ret = Math.max(ret, solve(i, k, t2) + solve(i + 1, c2 - k, t2)); return dp[i][c][t] = ret; } public int getMost(int[] costs, int[] times, int C, int T) { this.costs = costs; this.times = times; for (int[][] a : dp) for (int[] b : a) Arrays.fill(b, -1); return solve(0, C, T); } }