/**
* 879. 盈利计划
*
* 动态规划 背包问题
* 根据限制条件,需要三维数组:三个容量,两个限制条件
* 1 当前可选择的工作,2 已选择的小组员工人数,3 目前状态的工作获利下限
* 典型的动态规划和背包问题
* 注意点:
* 第三维 工作利润至少为 k (不是恰好,因为;利润可以多,所以Math.max(0, k - profitNum),当k - profitNum为负数时,统一取0维度的就可以)
*/
public class Solution879 {
public int profitableSchemes(int n, int minProfit, int[] group, int[] profit) {
int MOD = (int)1e9 + 7;
int len = group.length;
int[][][] dp = new int[len + 1][n + 1][minProfit + 1];
dp[0][0][0] = 1;
for (int i = 1; i <= len; i++) {
int groupNum = group[i - 1], profitNum = profit[i - 1];
for (int j = 0; j <= n; j++) {
for (int k = 0; k <= minProfit; k++) {
if (j < groupNum) {
dp[i][j][k] = dp[i - 1][j][k];
} else {
dp[i][j][k] = (dp[i - 1][j][k] + dp[i - 1][j - groupNum][Math.max(0, k - profitNum)]) % MOD;
}
}
}
}
int res = 0;
for (int j = 0; j <= n; j++) {
res = (dp[len][j][minProfit] + res) % MOD;
}
return res;
}
}
LeetCode--879. 盈利计划
最新推荐文章于 2022-11-22 21:36:50 发布