当前位置: 首页 > 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;
    }
};

在这里插入图片描述

相关文章:

  • 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】泛型与集合篇 —— 泛型
  • 今年4月上海一二手房成交面积同比增21%,二手房成交2.07万套
  • 国务院安委办、应急管理部进一步调度部署“五一”假期安全防范工作
  • 小核酸药物企业瑞博生物递表港交所,去年亏损2.81亿元
  • 视频丨中国海警位中国黄岩岛领海及周边区域执法巡查
  • 奈雪的茶叫停“能喝奶茶就不要喝水”宣传,当地市监称不要误导消费者
  • 迎接八方来客:全国多地“五一”假期党政机关大院停车场免费开放