Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang刷letcode:公平分发饼干

golang刷letcode:公平分发饼干

作者头像
golangLeetcode
发布于 2022-08-02 11:49:15
发布于 2022-08-02 11:49:15
16600
代码可运行
举报
运行总次数:0
代码可运行

给你一个整数数组 cookies ,其中 cookies[i] 表示在第 i 个零食包中的饼干数量。另给你一个整数 k 表示等待分发零食包的孩子数量,所有 零食包都需要分发。在同一个零食包中的所有饼干都必须分发给同一个孩子,不能分开。

分发的 不公平程度 定义为单个孩子在分发过程中能够获得饼干的最大总数。

返回所有分发的最小不公平程度。

示例 1:

输入:cookies = [8,15,10,20,8], k = 2

输出:31

解释:一种最优方案是 [8,15,8] 和 [10,20] 。

- 第 1 个孩子分到 [8,15,8] ,总计 8 + 15 + 8 = 31 块饼干。

- 第 2 个孩子分到 [10,20] ,总计 10 + 20 = 30 块饼干。

分发的不公平程度为 max(31,30) = 31 。

可以证明不存在不公平程度小于 31 的分发方案。

示例 2:

输入:cookies = [6,1,3,2,2,4,1,2], k = 3

输出:7

解释:一种最优方案是 [6,1]、[3,2,2] 和 [4,1,2] 。

- 第 1 个孩子分到 [6,1] ,总计 6 + 1 = 7 块饼干。

- 第 2 个孩子分到 [3,2,2] ,总计 3 + 2 + 2 = 7 块饼干。

- 第 3 个孩子分到 [4,1,2] ,总计 4 + 1 + 2 = 7 块饼干。

分发的不公平程度为 max(7,7,7) = 7 。

可以证明不存在不公平程度小于 7 的分发方案。

提示:

2 <= cookies.length <= 8

1 <= cookies[i] <= 105

2 <= k <= cookies.length

解题思路

1,本题是背包问题的变形,只不过是分配给每个孩子的事集合的子集

2,假设数组长度为n,那么数组的子集个数为2^n

3, 可以于处理所有子集合的元素和 :计算位置i以前的所有枚举集合的元素和;即2^(i+1)个枚举集合的和;对于每一个子集可以通过固定位置i,枚举比i小的所有位置,通过位运算来实现。

4,定义状态转移方程 f[i][j], 前i个孩子,分配的枚举集合j,得到的不公平程度最小值,其中有两层含义:求每一种分配的不公平程度(拆分成不同集合的时候,每个孩子分配的饼干和最大值),求所有不公平程度的最小值。

5,对于前i个孩子,在分配元素组成的集合的子集时候,假设第i个孩子分配了集合s;此时的不公平程度为max(f[i-1][j^s],sum[s]), 即不包含s的剩余集合分配给前i-1个元素的不公平程度最小值和s集合的和,两者取小者;其中s的枚举范围为0到j

6,i个孩子分配元素集合j的最小不公平程度为:f[i][j]=min(f[i][j],max(f[i-1][j^s],sum[s]));其中j的枚举范围是0到m;

7,我们的答案就是分配给k个孩子,集合枚举情况m的最小值,f[k-1][m-1]

8,初始条件,f[0][j]=sum[j];其中j取值是0到m;把集合只分配给一个孩子,最小不公平程度就是集合的元素和;f[i][j]=sum[j]为不公平程度的最大值,假设所有元素都分配给孩子i,不公平程度不会比这个更大

9,由于i依赖i-1所以是递增;由于j是从更大的集合取差集,所以j递减;

10,枚举集合j中的所有子集合可以使用位运算技巧,(s-1)&j

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func distributeCookies(cookies []int, k int) int {
    m := 1 << len(cookies)
    sum := make([]int, m)
    for i, v := range cookies {
        for mask, bit := 0, 1<<i; mask < bit; mask++ {
            sum[bit|mask] = sum[mask] + v
        }
    }
    
   f:=make([][]int,k)
   for i:=0;i<k;i++{
       f[i]=make([]int,m)
   }
   f[0]=sum
   for i:=1;i<k;i++{
      for j:=m-1;j>0;j--{
          f[i][j]=sum[j]
         for s:=j;s>0;s=(s-1)&j{
            f[i][j]=min(f[i][j],max(f[i-1][j^s],sum[s]))
         }     
      }
   }
return f[k-1][m-1]
}

func min(a, b int) int { if a > b { return b }; return a }
func max(a, b int) int { if b > a { return b }; return a }

由于每个i只依赖i-1,所以可以进行优化,压缩掉一维

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func distributeCookies(cookies []int, k int) int {
    m := 1 << len(cookies)
    sum := make([]int, m)
    for i, v := range cookies {
        for mask, bit := 0, 1<<i; mask < bit; mask++ {
            sum[bit|mask] = sum[mask] + v
        }
    }
    f := append([]int{}, sum...)
    for i := 1; i < k; i++ {
        for j := m - 1; j > 0; j-- {
            for s := j; s > 0; s = (s - 1) & j {
                f[j] = min(f[j], max(f[j^s], sum[s]))
            }
        }
    }
    return f[m-1]
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 5289. 公平分发饼干(DFS)
给你一个整数数组 cookies ,其中 cookies[i] 表示在第 i 个零食包中的饼干数量。 另给你一个整数 k 表示等待分发零食包的孩子数量,所有 零食包都需要分发。 在同一个零食包中的所有饼干都必须分发给同一个孩子,不能分开。
Michael阿明
2022/06/13
4390
LeetCode周赛297,一小时AK你也可以
今天是周一,我们照惯例来看看LeetCode周赛。这次周赛是地平线赞助的,如果没记错,这已经不是这个公司第一次赞助了。前5名可以获得直接进入面试的机会,前200名可以获得内推。
TechFlow-承志
2022/09/21
4410
LeetCode周赛297,一小时AK你也可以
贪心——455. 分发饼干
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
向着百万年薪努力的小赵
2022/12/02
2540
455.分发饼干【分配问题】
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
繁依Fanyi
2023/05/07
2890
455.分发饼干【分配问题】
​LeetCode刷题实战455:分发饼干
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/12/06
2470
LeetCode 455. 分发饼干
https://leetcode-cn.com/problems/assign-cookies/
freesan44
2021/11/14
3900
LeetCode 455. 分发饼干
分发饼干——贪心算法
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
用户8639654
2021/08/24
4080
【1024节日快乐!】LeetCode--分发饼干
题目来源:力扣(LeetCode) 题目链接:https://leetcode.cn/problems/assign-cookies
周小末天天开心
2022/10/26
2710
【1024节日快乐!】LeetCode--分发饼干
LeetCode 455. 分发饼干(贪心)
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
SakuraTears
2022/01/13
2390
LeetCode 455. 分发饼干(贪心)
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
Michael阿明
2020/07/13
3340
LeetCode 455. 分发饼干(贪心)
455. 分发饼干
每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。 你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 示例 1: 输入: g = [1,2,3], s = [1,1] 输出: 1 解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 虽然你有两块小饼干,由于他们的尺
编程张无忌
2021/06/10
3390
力扣455-分发饼干-贪心算法
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
ccf19881030
2023/03/14
4330
力扣455-分发饼干-贪心算法
【算法千题案例】⚡️每日LeetCode打卡⚡️——57.分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
呆呆敲代码的小Y
2021/10/20
3870
​二分 or 回溯 or bitmask dp
在leetcode上有如下四种题目,做法类似,题目描述大同小异,涉及的算法包括:状态压缩dp、二分、递归、回溯,可算得上是比较好的几道题,今天来做个小结。
公众号guangcity
2021/09/18
6860
【Leetcode -455.分发饼干 -459.重复的字符串】
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
YoungMLet
2024/03/01
1030
【Leetcode -455.分发饼干 -459.重复的字符串】
优化策略:揭秘钢条切割与饼干分发的算法艺术
        在生活中,钢条和饼干看似风马牛不相及,但它们的分割与分发却隐藏着惊人的数学魅力。如何最大化利润?如何用有限的资源最大程度满足需求?这便是算法世界中的艺术。今天,我们来揭秘钢条切割与饼干分发的算法设计。本文不仅有趣,也能带你领略算法的美妙和工程师的智慧。
LucianaiB
2024/11/20
1320
LeetCode455分发饼干c++贪心解法
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
莫浅子
2022/11/18
2700
LeetCode455分发饼干c++贪心解法
常用算法之贪心算法
思路:求解问题时,总是选当前最好的选择,不从整体上考虑。因而选用贪心算法必须保证当前选的最好的必定是整体最好的。
爬蜥
2019/07/09
6620
优化策略:揭秘钢条切割与饼干分发的算法艺术
在生活中,钢条和饼干看似风马牛不相及,但它们的分割与分发却隐藏着惊人的数学魅力。如何最大化利润?如何用有限的资源最大程度满足需求?这便是算法世界中的艺术。今天,我们来揭秘钢条切割与饼干分发的算法设计。本文不仅有趣,也能带你领略算法的美妙和工程师的智慧。
LucianaiB
2024/11/10
920
优化策略:揭秘钢条切割与饼干分发的算法艺术
【算法】分治思想、动态规划、回溯、贪心算法
分治算法思想很大程度上是基于递归的,也比较适合用递归来实现。顾名思义,分而治之。一般分为以下三个过程:
微芒不朽
2022/09/06
9320
相关推荐
LeetCode 5289. 公平分发饼干(DFS)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档