Number of Dice Rolls With Target Sum

medium dp counting

Problem

You have n dice, each with k faces numbered 1 to k. Return the number of ordered ways to roll them so the sum equals target, modulo 10⁹ + 7.

Inputn = 2, k = 6, target = 7
Output6
(1,6),(2,5),(3,4),(4,3),(5,2),(6,1).

def num_rolls_to_target(n, k, target):
    MOD = 10**9 + 7
    dp = [[0] * (target + 1) for _ in range(n + 1)]
    dp[0][0] = 1
    for i in range(1, n + 1):
        for s in range(1, target + 1):
            for f in range(1, k + 1):
                if s - f >= 0:
                    dp[i][s] = (dp[i][s] + dp[i-1][s-f]) % MOD
    return dp[n][target]
function numRollsToTarget(n, k, target) {
  const MOD = 1000000007n;
  const dp = Array.from({length: n + 1}, () => Array(target + 1).fill(0n));
  dp[0][0] = 1n;
  for (let i = 1; i <= n; i++) {
    for (let s = 1; s <= target; s++) {
      for (let f = 1; f <= k; f++) {
        if (s - f >= 0) dp[i][s] = (dp[i][s] + dp[i-1][s-f]) % MOD;
      }
    }
  }
  return Number(dp[n][target]);
}
class Solution {
    public int numRollsToTarget(int n, int k, int target) {
        final int MOD = 1_000_000_007;
        long[][] dp = new long[n + 1][target + 1];
        dp[0][0] = 1;
        for (int i = 1; i <= n; i++) {
            for (int s = 1; s <= target; s++) {
                for (int f = 1; f <= k; f++) {
                    if (s - f >= 0) dp[i][s] = (dp[i][s] + dp[i-1][s-f]) % MOD;
                }
            }
        }
        return (int) dp[n][target];
    }
}
int numRollsToTarget(int n, int k, int target) {
    const int MOD = 1e9 + 7;
    vector<vector<long long>> dp(n + 1, vector<long long>(target + 1, 0));
    dp[0][0] = 1;
    for (int i = 1; i <= n; i++) {
        for (int s = 1; s <= target; s++) {
            for (int f = 1; f <= k; f++) {
                if (s - f >= 0) dp[i][s] = (dp[i][s] + dp[i-1][s-f]) % MOD;
            }
        }
    }
    return (int) dp[n][target];
}
Time: O(n · target · k) Space: O(n · target)