当前位置: 首页 > news >正文

leetcode 2585. 获得分数的方法数

题目如下
在这里插入图片描述

数据范围
在这里插入图片描述

莫要被困难的外衣骗了,本题就是有数量限制的完全背包问题。显然我们可以令
f(x,y)为当有x种题目时分数为y时的方法数 令某种题目的数量为k
那么方法数应该是 f(x,y) = f(x - 1,y - k * (分值))其中(0 <= k <= 题目数量)

通过代码

class Solution {
public:
    int waysToReachTarget(int target, vector<vector<int>>& types) {
        int mod = 1e9 + 7;
        int n = types.size();
        vector<vector<int>> dp(2,vector<int>(target + 1));
        int pre = 0,cur;
        dp[0][0] = 1;
        for(int i = 1;i <= types[0][0];i++){
            if(i * types[0][1] <= target){
                dp[0][i * types[0][1]] = 1;
            }
        }
        for(int i = 1;i < n;i++){
            pre = (i - 1) % 2;
            cur = i % 2;
            for(int j = 0;j <= target;j++){
                dp[cur][j] = 0;
                for(int k = 0;k <= types[i][0];k++){
                    if(k * types[i][1] <= j){
                        dp[cur][j] = (dp[cur][j] + dp[pre][j - k * types[i][1]]) % mod;
                    }
                }
            }
            
        }
        return dp[cur][target] % mod;
    }
};

在这里插入图片描述
利用滚动数组的思想优化后

class Solution {
public:
    int waysToReachTarget(int target, vector<vector<int>>& types) {
        int mod = 1e9 + 7;
        int n = types.size();
        vector<int> dp(target + 1);
        int pre = 0,cur;
        dp[0] = 1;
        for(int i = 1;i <= types[0][0];i++){
            if(i * types[0][1] <= target){
                dp[i * types[0][1]] = 1;
            }
        }
        for(int i = 1;i < n;i++){
            for(int j = target;j >= 0;j--){
                for(int k = 1;k <= types[i][0];k++){
                    if(k * types[i][1] <= j){
                        dp[j] = (dp[j] + dp[j - k * types[i][1]]) % mod;
                    }else{
                        break;
                    }
                }
            }
            
        }
        return dp[target] % mod;
    }
};

在这里插入图片描述

http://www.dtcms.com/a/27705.html

相关文章:

  • C/C++ 格式化输出( unsigned long long)
  • vue stores全局状态共享
  • alphafold3本地部署
  • 划分字母区间
  • 【Qt】常用控件(一)
  • 【练习】【二分】力扣热题100 153. 寻找旋转排序数组中的最小值
  • C++ Qt建立一个HTTP服务器
  • 鸿蒙开发:V2版本装饰器之@Monitor装饰器
  • 阐解WiFi信号强度
  • Linux centOS7 bash编程小技巧
  • Vue3中的setup
  • Linux应用之构建命令行解释器(bash进程)
  • vue3之echarts柱状图-圆锥加自动轮播
  • 使用Termux将安卓手机变成随身AI服务器(page assist连接)
  • Pyrhon函数-装饰器第一部分250219
  • C程序设计(第5版)——谭浩强(2)
  • 构建简单RAG代码实现
  • java常见面试场景题
  • nodejs各版本下载地址 —— 筑梦之路
  • 【Java】泛型与集合篇 —— 泛型
  • virt-io 如何运行在 kvm windows 虚拟机上
  • rust学习三、基本类型
  • Spring框架基本使用(Maven详解)
  • 【二分搜索 C/C++】洛谷 P1873 EKO / 砍树
  • SAM C++ TensorRT(实时图像分割)
  • 【有啥问啥】DeepSeek 技术原理详解
  • vue取消全选功能按钮注意事项
  • java机器学习计算指标动态阈值
  • Jackson使用
  • 点击unity资源文件自动展开左侧的文件路径