seamew的妙妙屋seamew的妙妙屋
首页
  • kafka监控
  • my-spring
  • Gitee
  • Github
首页
  • kafka监控
  • my-spring
  • Gitee
  • Github
  • BUG

    • BeanUtils报错
    • Thread的名字问题
  • JAVA

    • Threadlocal
    • 线程池源码分析
  • JS进阶

    • JS开发技巧
  • linux

    • centos防火墙
    • vagrant
    • 正则表达式
  • springboot进阶学习

    • @Configuration和@Bean注解
    • springboot接收参数详解
    • springboot配置多数据源
    • 事务导致多数据源切换失败
  • spring进阶学习

    • aop创建代理基本流程
    • 三级缓存解决循环依赖
  • 云原生

    • 自动化部署
  • 前端开发

    • vue-computed计算属性引发的BUG
  • 大数据

    • kafka事务
    • zookeeper
  • 算法

    • 动态规划

      • 动态规划基础理论
      • 抛骰子和为k的概率
    • 回溯算法

      • used数组是局部还是全局
      • 最优解快速返回
    • 图论

      • dfs简介
    • 多线程

      • 打印ABC
    • 贪心

      • 小于n的最大数字

题目描述

有n个一样的骰子,他们有f面(即骰子的点数从1到f),问投掷这些骰子和为target的概率为多少?

注意

不能使用回溯

题解

这是一道经典的背包问题。背包问题的详解可以看本网站的这一篇博客->背包问题详解

该题目是一个分组背包,只需要在0/1背包基础上加上一层循环遍历每一个分组即可

long long mod = 1e9 + 7;
int numRollsToTarget(int n, int f, int target) {
    vector<vector<long long>> dp(n + 1, vector<long long>(target + 1));
    dp[0][0] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= f; j++) {
            for (int k = target; k >= j; k--) {
                dp[i][k] = (dp[i][k] + dp[i - 1][k - j]) % mod;
            }
        }
    }
    return dp[n][target];
}
上次更新: 2026/3/21 07:25
上一页
动态规划基础理论