测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A18734. 条形蛋糕

填空题 困难

题目描述

条形蛋糕

题目描述

寒假到了,小杨同学打算找一份兼职,顺便体验一下打工人的生活。

小杨同学给一家蛋糕店发送了一份自己的简历,希望可以在寒假来这里帮忙。店长最近正好遇到了一个难题:店里每天会做一条长条蛋糕,但是不同长度的蛋糕块卖出的价格不同,应该怎么分才能卖得最多呢?

有趣的是店长曾经学习过计算机专业。他最近对动态规划算法很感兴趣,于是打算用这个问题考一考小杨同学,问题如下:

给定一条长度为 的长条蛋糕和一个价格表,该价格表表示长度为 i(i= 1,2,...,n)的蛋糕块的价格为 pi 。求蛋糕的分割方案,使得总销售价格最大,注意蛋糕块的长度必须为整数。

输入格式

第一行一个正整数 n(1≤ n ≤ 103),表示长条蛋糕的总长度。

第二行 n 个正整数 p1 ,p2 ,...,pn( 1≤ pi  ≤105),表示不同长度蛋糕块的价格。

输出格式

一行一个正整数,表示最大总销售价格。

输入样例 1

4
1 5 8 9

输出样例 1

10

输入样例 2

10
1 5 8 9 10 17 17 20 24 30

输出样例 2

30

参考答案

# 蛋糕长度 n = int(input()) # 蛋糕长度及其对应的价钱 p = list(map(int, input().split())) p = [0] + p # f[i][j] = 只使用长度 1..i 的蛋糕块,总长度为 j 时的最大总价 f = [[0] * (n + 1) for _ in range(n + 1)] for i in range(1, n + 1): for j in range(1, n + 1): if j >= i: f[i][j] = max(f[i - 1][j], f[i][j - i] + p[i]) else: f[i][j] = f[i - 1][j] print(f[n][n])

答案解析

# 蛋糕长度
n = int(input())
# 蛋糕长度及其对应的价钱
p = list(map(int, input().split()))
p = [0] + p

# f[j] 总长度 j 的最大总价
f = [0] * (n + 1)
# 当前可用最大蛋糕长度
for i in range(1, n + 1):
    # 从小到大更新,允许重复选取同长度蛋糕
    for j in range(i, n + 1):
        f[j] = max(f[j], f[j - i] + p[i])
print(f[n])


上一题 下一题