首页 > 其他分享 >2024-03-30:用go语言,集团里有 n 名员工,他们可以完成各种各样的工作创造利润, 第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与, 如果成员参与

2024-03-30:用go语言,集团里有 n 名员工,他们可以完成各种各样的工作创造利润, 第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与, 如果成员参与

时间:2024-03-30 13:11:48浏览次数:15  
标签:03 group int 成员 profit minProfit go 复杂度 dp

2024-03-30:用go语言,集团里有 n 名员工,他们可以完成各种各样的工作创造利润,

第 i 种工作会产生 profit[i] 的利润,它要求 group[i] 名成员共同参与,

如果成员参与了其中一项工作,就不能参与另一项工作,

工作的任何至少产生 minProfit 利润的子集称为 盈利计划,

并且工作的成员总数最多为 n。

有多少种计划可以选择?因为答案很大,所以 返回结果模 10^9 + 7 的值。

输入:n = 5, minProfit = 3, group = [2,2], profit = [2,3]。

输出:2。

答案2024-03-30:

来自左程云

灵捷3.5

大体步骤如下:

这三种算法都解决了一个问题,即在给定一组工作和利润以及员工的人数限制下,找出满足最低利润要求的盈利计划数量。以下是它们的大体过程:

profitableSchemes1:

1.递归函数 f1 对组合进行深度优先搜索,尝试每种工作的所有可能性,以达到满足最低利润要求的盈利计划。

2.检查每种工作是否满足人数限制,并计算利润是否达到最低要求。

3.返回满足条件的计划数量。

profitableSchemes2:

1.使用动态规划方法,创建三维数组 dp 以保存中间结果。

2.递归函数 f2 逐步填充 dp 数组,记录以当前工作和利润数为基础时的计划数量。

3.每次计算时检查数组中是否已有记录,避免重复计算。

4.返回最终计划数量。

profitableSchemes3:

1.同样采用动态规划,但只使用二维数组 dp,减少额外空间的使用。

2.从最后一个工作向前逐步计算满足条件的计划数量。

3.根据当前工作是否选择、人数是否足够、利润是否达标,更新动态规划数组中的值。

4.最终输出满足条件的计划数量。

复杂度分析:

  • 时间复杂度:

    • profitableSchemes1: 由于是基于递归的深度优先搜索,时间复杂度较高,为指数级别,取决于工作数量和员工人数。

    • profitableSchemes2: 使用了动态规划并记录了每个可能情况,时间复杂度为 O(m * n * minProfit),m 为工作数量,n 为员工人数。

    • profitableSchemes3: 类似于第二种算法,但只使用了二维数组,时间复杂度也为 O(m * n * minProfit)。

  • 空间复杂度:

    • profitableSchemes1: 仅有递归调用的栈空间,空间复杂度取决于递归深度。

    • profitableSchemes2: 使用了三维数组 dp,空间复杂度为 O(m * n * minProfit)。

    • profitableSchemes3: 使用了二维数组 dp,空间复杂度为 O(n * minProfit)。

Go完整代码如下:

package main

import "fmt"

func profitableSchemes1(n int, minProfit int, group []int, profit []int) int {
    return f1(group, profit, 0, n, minProfit)
}

func f1(g []int, p []int, i int, r int, s int) int {
    if r <= 0 {
        if s <= 0 {
            return 1
        } else {
            return 0
        }
    }
    if i == len(g) {
        if s <= 0 {
            return 1
        } else {
            return 0
        }
    }
    p1 := f1(g, p, i+1, r, s)
    p2 := 0
    if g[i] <= r {
        p2 = f1(g, p, i+1, r-g[i], s-p[i])
    }
    return p1 + p2
}

var mod = 1000000007

func profitableSchemes2(n int, minProfit int, group []int, profit []int) int {
    m := len(group)
    dp := make([][][]int, m)
    for a := 0; a < m; a++ {
        dp[a] = make([][]int, n+1)
        for b := 0; b <= n; b++ {
            dp[a][b] = make([]int, minProfit+1)
            for c := 0; c <= minProfit; c++ {
                dp[a][b][c] = -1
            }
        }
    }
    return f2(group, profit, 0, n, minProfit, dp)
}

func f2(g []int, p []int, i int, r int, s int, dp [][][]int) int {
    if r <= 0 {
        if s == 0 {
            return 1
        } else {
            return 0
        }
    }
    if i == len(g) {
        if s == 0 {
            return 1
        } else {
            return 0
        }
    }
    if dp[i][r][s] != -1 {
        return dp[i][r][s]
    }
    p1 := f2(g, p, i+1, r, s, dp)
    p2 := 0
    if g[i] <= r {
        p2 = f2(g, p, i+1, r-g[i], max(0, s-p[i]), dp)
    }
    ans := (p1 + p2) % mod
    dp[i][r][s] = ans
    return ans
}

func max(x, y int) int {
    if x > y {
        return x
    }
    return y
}

func profitableSchemes3(n int, minProfit int, group []int, profit []int) int {
    dp := make([][]int, n+1)
    for r := 0; r <= n; r++ {
        dp[r] = make([]int, minProfit+1)
        dp[r][0] = 1
    }
    m := len(group)
    for i := m - 1; i >= 0; i-- {
        for r := n; r >= 0; r-- {
            for s := minProfit; s >= 0; s-- {
                p1 := dp[r][s]
                p2 := 0
                if group[i] <= r {
                    p2 = dp[r-group[i]][max(0, s-profit[i])]
                }
                dp[r][s] = (p1 + p2) % mod
            }
        }
    }
    return dp[n][minProfit]
}

func main() {
    n := 5
    minProfit := 3
    group := []int{2, 2}
    profit := []int{2, 3}

    result1 := profitableSchemes1(n, minProfit, group, profit)
    fmt.Println("Result using profitableSchemes1:", result1)

    result2 := profitableSchemes2(n, minProfit, group, profit)
    fmt.Println("Result using profitableSchemes2:", result2)

    result3 := profitableSchemes3(n, minProfit, group, profit)
    fmt.Println("Result using profitableSchemes3:", result3)
}

在这里插入图片描述

标签:03,group,int,成员,profit,minProfit,go,复杂度,dp
From: https://www.cnblogs.com/moonfdd/p/18105360

相关文章

  • python+django在线政务便民服务系统flask
     随着时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,在线政务服务中心管理当然不能排除在外。在线政务服务中心管理系统是在实际应用和软件工程的开发原理之上,运用python语言以及vue框架进行开发。首先要进行需求分析,分析出在线政......
  • Django中values()和values_list()
    values()1、不带参数,返回所有属性的键值对,比如使用filter时,会返回一个列表,列表中每一项是一个字典>>>Blog.objects.values()[{'id':1,'name':'BeatlesBlog','tagline':'AllthelatestBeatlesnews.'}],>>>Blog.objects.filte......
  • Go 开发踩过的那些坑(适合Java转Go)
    做完事情就总结,是个好习惯。花了一个多月,将写了一年半多的Java工程迁移到Go上。来小结下学到的东西吧!一些基础map访问Javamap.get(key)ormap.getOrDefault(key,defaultValue)Goifvalue,ok:=map[key];ok{//...code}强制类型转换注意,转换为*......
  • 探索 Go 的 Fan-Out/Fan-In 模式:让并发更 easy
    探索Go的Fan-Out/Fan-In模式:让并发更easy原创 GoOfficialBlog GoOfficialBlog 2024-03-2921:03 中国香港 听全文学习如何利用Go语言的并发性能,使用扇出/扇入模式。探索这种模式如何在Go应用程序中简化复杂的并发任务。Introduction并发在Go中可以......
  • centos7提示 file /root/.serverauth.13703 does not exist
    情况背景:安装虚拟数据服务器,使用系统为centos7,安装完成后,开始安装图形化程序,在虚拟服务器上一切正常,输入startx也会正常显示图形操作界面问题来源:现在通过其他电脑远程连接虚拟数据服务器,输入地址进入也是正常,但是输入“startx”命令后就显示失败代码,无法进入图形操作界面,如......
  • Go标准库源码分析: atomic.AddInt64
    atomic.AddInt64介绍原理源码看不到源码解释个勾八原理源码里只有函数doc,但是没有函数实现,但是有一段注释//AddInt64atomicallyaddsdeltato*addrandreturnsthenewvalue.//Considerusingthemoreergonomicandlesserror-prone[Int64.Add]instead/......
  • 003 git的日常操作-新建分支
    新建分支一、本地仓库与远程仓库都无此分支创建本地分支dev并将其关联到远程仓库的origin/dev分支。步骤:检查当前所在分支,确保不在dev分支上:gitbranch如果不在dev分支上,切换到master或其他主分支-取决于你想让该分支拥有那个分支的数据:gitcheckoutmaster......
  • golang: 分析查看汇编代码
    golang:分析查看汇编代码查看可执行文件可视化注意:linux用户需要额外运行goinstall--tagsnowaylandloov.dev/lensm@main​下载lensm:goinstallloov.dev/lensm@main运行lensm​:lensm.\main.exe​效果:​​Gobuild​gobuild-gcflags-S.\main.go​......
  • 20240328
    续昨天。T8洛谷P4150最短路问题行数很小,考虑使用矩阵。对于一个区间\([l,r]\),维护\(ll_{i,j},rr_{i,j},lr_{i,j}\)分别表示\((i,l)\rightarrow(j,l)\)、\((i,r)\rightarrow(j,r)\)、\((i,l)\rightarrow(j,r)\)的最小代价。为了转移方便,再维护\(lm_{i......
  • 20240329打卡
    第五周第一天第二天第三天第四天第五天第六天第七天所花时间20h4h4h2h3h代码量(行)877164371214478博客量(篇)11111知识点了解navigation路由配置,jetpackcompose组件运用,容器封装第一次结对作业开始Web搓后端ing~完成了大部分个人W......