首页 > 其他分享 >状压DP-1815. 得到新鲜甜甜圈的最多组数

状压DP-1815. 得到新鲜甜甜圈的最多组数

时间:2022-08-19 20:48:50浏览次数:84  
标签:1815 nums 甜甜 状压 groups 顾客 batchSize DP

问题描述

有一个甜甜圈商店,每批次都烤 batchSize 个甜甜圈。这个店铺有个规则,就是在烤一批新的甜甜圈时,之前 所有 甜甜圈都必须已经全部销售完毕。给你一个整数 batchSize 和一个整数数组 groups ,数组中的每个整数都代表一批前来购买甜甜圈的顾客,其中 groups[i] 表示这一批顾客的人数。每一位顾客都恰好只要一个甜甜圈。

当有一批顾客来到商店时,他们所有人都必须在下一批顾客来之前购买完甜甜圈。如果一批顾客中第一位顾客得到的甜甜圈不是上一组剩下的,那么这一组人都会很开心。

你可以随意安排每批顾客到来的顺序。请你返回在此前提下,最多 有多少组人会感到开心。

示例 1:

输入:batchSize = 3, groups = [1,2,3,4,5,6]
输出:4
解释:你可以将这些批次的顾客顺序安排为 [6,2,4,5,1,3] 。那么第 1,2,4,6 组都会感到开心。
示例 2:

输入:batchSize = 4, groups = [1,3,2,5,2,2,1,6]
输出:4

提示:

1 <= batchSize <= 9
1 <= groups.length <= 30
1 <= groups[i] <= 109

问题求解

直接对group进行状压是一定会超时的,但是考虑到batchsize很小,因此可以对batchsize状压。

  • 对groups里每个元素%batchsize,其中为0的可以直接先处理,因此最终只会剩余至多8个不同的数字。
  • 在每一步处理的时候,对已经处理过的数字进行计数,这样就可以控制每一步的扩展空间。
class Solution:
    def maxHappyGroups(self, batch: int, nums: List[int]) -> int:
        
        nums = [i % batch for i in nums]
        res = nums.count(0)
        nums = [i for i in nums if i != 0]
        n = len(nums)

        @cache
        def dfs(rest, mask):
            if mask == (1 << n) - 1:
                return 0
            res = 0
            used = set()
            for i, num in enumerate(nums):
                if mask >> i & 1 == 0 and num not in used:
                    used.add(num)
                    res = max(res, dfs((rest + nums[i]) % batch, mask | (1 << i)))

            return res + int(rest == 0)
                        
        res = res + dfs(0, 0)
        
        return res

标签:1815,nums,甜甜,状压,groups,顾客,batchSize,DP
From: https://www.cnblogs.com/hyserendipity/p/16603242.html

相关文章

  • 【DP】#1109. [POI2007]堆积木Klo
    https://darkbzoj.cc/problem/1109分析考虑状态表示原来在位置\(i\)的数有贡献(也就是说在结束操作后它的位置\(i'\)满足\(i'=w_i\))的最大值为\(f[i]\)。那么我们......
  • 如何使用 K3s 部署 Wordpress
    为什么使用K3s部署Wordpress很多朋友使用Docker或者宝塔来部署Wordpress,如果只有一台服务器,这样搞没问题。不过我建议使用K3s部署Wordpress,因为这样才能享受......
  • Dp的优化
    Dp的优化单调栈优化DpTheGreatWallII题意:给你n个点,问分成1∼n组,每一组的代价就是这一组中的最大值,问每一种情况的最小权值和。思路:把状态定义为dij表示......
  • 千兆以太网_发送模块设计_udp_rgmii_tx
    功能:在FPGA开发板上,用户数据存于FIFO,经过UDP,IP,MAC封装,通过RGMII接口发送出去。完整的以太网应该包括收发功能,这里介绍发送模块。实现:序列机过程:发送顺序:  MAC帧头—......
  • 【kuangbin】专题十二 基础DP1
    【kuangbin】专题十二基础DP1https://vjudge.net/contest/68966#overview前几周写了来着,忘更了我饿了,先放代码,吃完再来A-MaxSumPlusPlus#include<bits/stdc++.......
  • 压缩空间尝试使用只与前一个状态有关的dp dp[2][N]
    之后每次迭代t^1使得0->11->0这里有n个世界,每个世界都有m个点。在i个世界中,你最多可以选择一条边,从u点移动到v点(可以选择不移动)。随后进入到第i+1个世界......
  • 扑克牌(期望DP)
    题意Rainbow把一副扑克牌(\(54\)张)随机洗开,倒扣着放成一摞。然后Admin从上往下依次翻开每张牌,每翻开一张黑桃、红桃、梅花或者方块,就把它放到对应花色的堆里去。Rainb......
  • 【DP 记录】AcWing 734. 能量石
    传送门给你几个物品,每种选一次,求最大价值,首先想到01背包,但是我们遇到了一个问题:普通的01背包在选择物品时是不讲求顺序的,但在这道题中,物品的选择是有顺序的(即对最优......
  • 一种关于低代码平台(LCDP)建设实践与设计思路
    简介: 作者在负责菜鸟商业中心CRM系统开发过程中发现有一个痛点:业务线很多,每个业务线对同一个页面都有个性化布局和不同的字段需求,而他所在的团队就3个人,那么在资源有限的......
  • 区间DP の 题(内含 最长回文串,石子合并,删除字符串,乘积最大,释放囚犯)
    乘积最大  由于题目给定的是m,需要分解成m+1部分的乘积,不难想到乘号刚好是m个,那么该题就转化成了m个乘号的插入方式。  最优子结构分析:    设数字字符串为a1a......