public int profitableSchemes(int n, int minProfit, int[] group, int[] profit) {
    int m = group.length;
    int mod = 1_000_000_007;
    int[][][] dp = new int[m+1][n+1][minProfit + 1];//dp[i][j][k] 表示为考虑前i个任务,j个人参加工作完成至少k利润,
    for (int j = 0; j <= n; j++) {
        dp[0][j][0] = 1;//当没有任务时,无论多少人,利润为0的方案数为1,其他为0
    }
    for (int i = 1; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            for (int k = 0; k <= minProfit; k++) {
                dp[i][j][k] = dp[i - 1][j][k];
                if (j >= group[i-1]) {
                    dp[i][j][k] = (dp[i][j][k] + dp[i-1][j-group[i-1]][Math.max(k - profit[i-1], 0)]) % mod;
                }
            }
        }
    }

    return dp[m ][n][minProfit];
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.