华为笔试题目100及最佳答案,华为笔试题库与答案

大家好,小编来为大家解答以下问题,华为笔试题目100及最佳答案,华为笔试题库与答案,现在让我们一起来看看吧!

题目:

小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作,每项工作都有对应的耗时时长(单位h)和报酬,工作的总报酬为所有已完成工作的报酬之和。那么请你帮小明安排一下工作,保证小明在指定的工作时间内工作收入最大化不学python可以学c语言吗

输入描述:
输入的第一行为两个正整数T,n。T代表工作时长(单位h,0 < T < 100000),n代表工作数量(1 < n ≤ 3000)。
接下来是n行,每行包含两个整数t,w。t代表该项工作消耗的时长(单位h,t > 0),w代表该项工作的报酬。

输出描述:
输出小明指定工作时长内工作可获得的最大报酬。

示例:
输入:
40  3
20  10
20  20
20  5
输出:
30

考查知识点:
动态规划 ------ 01背包(笔试常考点,题库有多道相似题目,一定要加深理解)

思路分析:
本题可以通过二维dp和一维dp两种方法解答。
对于每一项工作应该比较:做该工作(减去该项工作付出的时间,并加上该工作相应报酬)和不做该工作,保留这两种情况收益大的结果。
一维数组优化一定要注意必须从后向前覆盖,来正确计算前面的状态。
建立dp数组要注意(t+1)*(n+1),且遍历时也要从1开始遍历,防止0-1出界。
动态规划问题建议根据代码手动填写一遍dp数组,文字解释往往对理解帮助不大。
背包问题有固定模板,多练习即可掌握。

python代码:(两种解法)
笔试时变量请自行处理

# t:工作总时长,n:工作数量, time:工作时间数组,earnings:工作报酬数组

#解法1:二维dp
def solve1(t, n, time, earnings):  
    dp = [[0] * (t + 1) for _ in range(n + 1)]
    for i in range(1, n + 1):
        for j in range(time[i - 1], t + 1):
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - time[i - 1]] + earnings[i - 1])
    return dp[-1][-1]


#解法2:一维dp优化解法
def solve2(t, n, time, earnings):
    dp = [0 for _ in range(t + 1)]
    for i in range(1, n + 1):
        for j in range(t, time[i - 1] - 1, -1):
            dp[j] = max(dp[j], dp[j - time[i - 1]] + earnings[i - 1])
    return dp[-1]


if __name__ == '__main__':
    t = 40
    n = 3
    time = [20, 20, 20]
    earnings = [10, 20, 5]
    res1 = solve1(t, n, time, earnings)
    res2 = solve2(t, n, time, earnings)
    print(res1 == 30)
    print(res2 == 30)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值