首页 > 其他分享 >和带限制的子多重集合的数目

和带限制的子多重集合的数目

时间:2023-10-15 14:44:46浏览次数:34  
标签:多重 cnt int 枚举 集合 new total 数目

给你一个下标从 0 开始的非负整数数组 nums 和两个整数 l 和 r 。
请你返回 nums 中子多重集合的和在闭区间 [l, r] 之间的子多重集合的数目 。

1. 多重背包 + 滑动窗口

class Solution {
public:
    int countSubMultisets(vector<int> &nums, int l, int r) {
        const int MOD = 1e9 + 7;
        int total = 0;
        unordered_map<int, int> cnt;//统计每个物品的个数
        for (int x: nums) {
            total += x;
            cnt[x]++;
        }
        if (l > total) return 0;

        r = min(r, total);
        vector<int> f(r + 1);//记录f[i]恰为i的组合个数,求组合数的背包问题,枚举物品,再枚举范围
        f[0] = cnt[0] + 1;//边界初始状态,重要
        cnt.erase(0);

        int sum = 0;//当前的枚举范围
        for (auto [x, c]: cnt) {//枚举物品
            auto new_f = f;//复制当前数组,用于滑动变量减少内存
            sum = min(sum + x * c, r); //减少枚举上界范围,优化
            for (int j = x; j <= sum; j++) {//
                new_f[j] = (new_f[j] + new_f[j - x]) % MOD;
                if (j >= (c + 1) * x)//大于这个范围的,会重复使用超过c次该物品
                    new_f[j] = (new_f[j] - f[j - (c + 1) * x] + MOD) % MOD; //滑动窗口
            }
            f = move(new_f);
        }

        int ans = 0;
        for (int i = l; i <= r; i++) 
            ans = (ans + f[i]) % MOD;
        return ans;
    }
};

1. 多重背包 + 二进制优化


标签:多重,cnt,int,枚举,集合,new,total,数目
From: https://www.cnblogs.com/929code/p/17765606.html

相关文章

  • 实验四报告: 熟悉Python字典、集合、字符串的使用
    实验目标本实验的主要目标是熟悉Python中字典、集合、字符串的创建和操作,包括字典的创建、访问、修改和合并,集合的创建、访问以及各种集合运算,以及字符串的创建、格式化和常用操作。实验要求通过编写Python代码,验证以下要求:熟悉Python字典的创建、访问、修改、合并。熟悉Pyt......
  • python实现fasta文件碱基序列每行按照指定数目输出
     001、(base)[root@pc1test1]#lsa.fatest.py(base)[root@pc1test1]#cata.fa##测试fasta>chr1tttcccggg>chr2tttgggjjjcccjjjjjj>chr3ccc>chr4aaaaatt(base)[root@pc1test1]#cattest.py##程序#!/usr/bin/envpython3#......
  • 6.7集合set
      ......
  • 6.8集合set练习题
      ......
  • Python 集合(Sets)3
    Python-合并集合在Python中,有几种方法可以合并两个或多个集合。您可以使用union()方法,该方法返回一个包含两个集合中所有项的新集合,或使用update()方法,将一个集合中的所有项插入另一个集合中:示例,union()方法返回一个包含两个集合中所有项的新集合:set1={"a","b","c"}se......
  • 近百个最新免费chatgpt访问集合,包含国内直接访问和国外升级版本
    近百个最新免费chatgpt访问集合,包含国内直接访问和国外升级版本。ChatGPT是一个基于人工智能的聊天机器人,它可以与用户进行自然语言交互。ChatGPT使用了最新的自然语言处理技术,包括深度学习和神经网络,以便更好地理解用户的意图和回答用户的问题。ChatGPT可以回答各种问题,包括但不限......
  • Python 集合(Sets)2
    访问项您无法通过引用索引或键来访问集合中的项。但是,您可以使用for循环遍历集合项,或者使用in关键字检查集合中是否存在指定的值。示例,遍历集合并打印值:thisset={"apple","banana","cherry"}forxinthisset:print(x)示例,检查集合中是否存在"banana":thisset={"......
  • 用友U8出纳管理操作提示集合中的498483已经加锁了,不能对集合中的数据进行加锁
    模块:出纳管理服务器上面登录数据库管理平台,选中相应的账套库执行语句deletefromCN_LockAcctbook;......
  • 1828. 统计一个圆中点的数目
    题目描述给你一个数组points,其中,表示第i个点在二维平面上的坐标。多个点可能会有相同的坐标。同时给你一个数组queries,其中,表示一个圆心在且半径为的圆。对于每一个查询,计算在第j个圆内点的数目。如果一个点在圆的边界上,我们同样认为它在圆内。请你返回一个数组answer,......
  • C# list判断集合中所有数据相同
    方式一:boolisALLSameCount=item.DetailItems.GroupBy(a=>a.SportsName).Count()==1;//判断集合体育项是否全部相同方式二:boolisALLSameCount=item.DetailItems.distinct().count()==1;//判断集合体育项是否全部相同参考地址:https://www.cnblogs.com/nuomibaibai/p/1744692......