题解 | #点菜问题#

点菜问题

http://www.nowcoder.com/practice/b44f5be34a9143aa84c478d79401e22a

点菜问题属于背包问题中的01背包

  • 物品是一个整体,两个状态,放或不放,因此得名01背包

  • 有n个物品,背包容量为m,每个物品有重量w和价值v,要求放入背包中的物品价值最大

  • 保存结果:dp[i][j]表示前i个物品放入容量为j的背包的最大价值

  • 递推起点:dp[0][j] = dp[i][0] = 0(同时也是边界值)

  • 递推公式:①如果第i件物品放进去,背包剩余容量为j - w[i] => dp[i][j] = dp[i - 1][j - w[i]] + v[i]; ②如果第i件物品不放进去,背包剩余容量为j => dp[i][j] = dp[i - 1][j]; 综合①②可以得出我们的解result = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i])

  • 补充:从result中可以看出,dp[i - 1]是不变的,因此我们可以将result的形式修改为 => result = max(dp[j], dp[j - w[i]] + v[i])。但是因为j - w[i] < j,为了避免在确定dp[j]时,dp[j - w[i]]已被更新,所以我们需要倒序遍历j

  • 最终解为:dp[m](dp初始化时范围设为[0,m])

def order():
    while True:
        try:
            list = [int(i) for i in input().split()]
            # m为背包容量(这里是手上有多少钱),n为物品数量(这里是能点几个菜)
            m, n = list[0], list[1]
            # weight为物品需要占用的背包容量(这里是价格),value为物品对应的价值(这里是可口程度)
            weight = []
            value = []
            for i in range(n):
                list = [int(j) for j in input().split()]
                weight.append(list[0])
                value.append(list[1])
            dp = [0 for i in range(m + 1)]  # dp的范围为[0, m]
            for i in range(n):
                for j in range(m, weight[i] - 1, -1):
                    dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
            print(dp[m])
        except (EOFError, KeyboardInterrupt):
            break


if __name__ == '__main__':
    order()
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:28
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
440577次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41484次浏览 524人参与
# 阿里云管培生offer #
119829次浏览 2219人参与
# 地方国企笔面经互助 #
7928次浏览 18人参与
# 同bg的你秋招战况如何? #
75577次浏览 552人参与
# 虾皮求职进展汇总 #
114215次浏览 884人参与
# 北方华创开奖 #
107300次浏览 599人参与
# 实习,投递多份简历没人回复怎么办 #
2454001次浏览 34848人参与
# 实习必须要去大厂吗? #
55678次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149825次浏览 1977人参与
# 投递实习岗位前的准备 #
1195707次浏览 18546人参与
# 你投递的公司有几家约面了? #
33178次浏览 188人参与
# 双非本科求职如何逆袭 #
661910次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4730次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157604次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11365次浏览 270人参与
# 发工资后,你做的第一件事是什么 #
12418次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35612次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20091次浏览 240人参与
# 我的上岸简历长这样 #
451924次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39235次浏览 314人参与
# 非技术岗是怎么找实习的 #
155850次浏览 2120人参与
牛客网
牛客企业服务