首页 > 解决方案 > 动态骰子总和 - 模

问题描述

你有 d 个骰子,每个骰子有 f 个面,编号为 1、2、...、f。

返回可能的方式数(在 fd 总方式中)以 10^9 + 7 为模来掷骰子,因此面朝上数字的总和等于目标。

我的代码适用于 f、d 和 target 的小值。它给出 0 作为大值的答案,例如 30、30、500。

我在解决模数发生的位置时遇到了很多困难。我的解决方案有什么问题?

int numRollsToTarget(int d, int f, int target)
{
    long long int dp[d][target];
    for (int i = 0; i < d; i++)
    {
        for (int j = 0; j < target; j++)
        {
            dp[i][j] = 0;
        }
    }
    for (int i = 0; i < f && i < target; i++)
    {
        dp[0][i] = 1;
    }
    for (int i = 1; i < d; i++)
    {
        for (int j = 0; j < target; j++)
        {
            if (j >= i)
                for (int k = max(0, j - f); k < min(j, f); k++)
                    dp[i][j] = (dp[i - 1][j - k - 1] % 1000000007 + 
                               dp[i][j] % 1000000007) % 1000000007;
        }
    }

    return dp[d - 1][target - 1];
}

标签: c++

解决方案


推荐阅读