M04110: 圣诞老人的礼物-Santa Clau’s Gifts
greedy, dp, http://cs101.openjudge.cn/practice/04110
圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿最多只能承受一定重量的糖果,请问圣诞老人最多能带走多大价值的糖果。
输入
第一行由两个部分组成,分别为糖果箱数正整数n(1 <= n <= 100),驯鹿能承受的最大重量正整数w(0 < w < 10000),两个数用空格隔开。其余n行每行对应一箱糖果,由两部分组成,分别为一箱糖果的价值正整数v和重量正整数w,中间用空格隔开。
输出
输出圣诞老人能带走的糖果的最大总价值,保留1位小数。输出为一行,以换行符结束。
样例输入
4 15
100 4
412 8
266 7
591 2样例输出
1193.0解题思路:计算平均值降序取,注意每箱糖果都可以拆分成任意散装组合带走。
python
# 2300012302 张惠雯 生命科学学院
n, w = map(int, input().split())
candies = []
for _ in range(n):
p, q = map(int, input().split())
for _ in range(q):
candies.append(p / q)
candies.sort(reverse=True)
'''
Degenerate slice indices are handled gracefully: an index that is too large
is replaced by the string size, an upper bound smaller than the lower bound
returns an empty string." e.g.:
w = [1,2,3]; sum(w[:6])
Out: 6
'''
value = sum(candies[:w])
print(f"{value:.1f}")python
N, TW = map(int, input().split()) # TW = total weight
bags = []
for _ in range(N):
v, w = map(int, input().split())
x = v/w
bags.append([x, v, w])
bags.sort(reverse = True)
ans = 0
for i in bags:
if i[2] <= TW:
ans += i[1]
TW -= i[2]
else:
ans += TW * i[0]
break
print("{:.1f}".format(ans))python
n, tw = map(int, input().split())
d = dict()
for _ in range(n):
v, w = map(int, input().split())
t = v/w
if t not in d:
d[t] = [v, w]
else:
d[t] = [d[t][0]+v, d[t][1]+w]
a = sorted(d, reverse=True)
ans = 0
for i in a:
if d[i][1] <= tw:
ans += d[i][0]
tw -= d[i][1]
else:
ans = ans + tw * i
break
print("{:.1f}".format(ans))2021fall-cs101,梁天书。
还是背包问题,只是这一次可分解,于是自己在预处理过程中把所有的礼品都分解了,转化成完全背包问题解决。
python
n,w = map(int, input().split())
gifts = []
for _ in range(n):
a, b = map(int, input().split())
c = a / b
for i in range(b):
gifts.append([c, 1])
value = [[0]*(w + 1) for _ in range(len(gifts) + 1)]
for i in range(1, len(gifts) + 1):
for j in range(w + 1):
if j < gifts[i-1][1]:
value[i][j] = value[i-1][j]
else:
value[i][j] = max(value[i-1][j-gifts[i-1][1]] + \
gifts[i-1][0],value[i-1][j])
ans = max(value[-1])
print(format(ans, '.1f'))