在Python中找到优化填充水果所需最低成本的程序
假设我们有一个名为fruits的列表和另外两个值k和cap。每个fruits[i]都有三个值:[c,s,t],这表示水果i的成本为每个c,每个水果的大小为s,总共有t个。 k表示容量为cap的水果篮子的数量。我们想要以以下限制依次填充水果篮子-
- 每个篮子只能装同类型的水果
- 每个篮子应该尽可能地满
- 每个篮子应该尽可能便宜
因此,我们必须找到填充尽可能多篮子所需的最低成本。
因此,如果输入如fruits= [[5,2,3],[6,3,2],[2,3,2]] k = 2 cap = 4,那么输出将是12,因为我们可以取两个0号水果,因为这两个水果,我们可以使第一个篮子总大小为2 + 2 = 4,它的成本为5 + 5 = 10。然后,我们使用其中一个水果2,因为它更便宜。这需要2个单位。
为了解决这个问题,我们将按照以下步骤进行-
- options:一个新的列表
- 对于fruits中的每个三元组(c,s,t),执行以下操作
- 当t > 0时,做以下操作
- fnum:cap / s和t的底部的最小值
- 如果fnum与0相同,则
- 从循环中出来
- bnum:t / fnum的底部
- 在options结尾处插入三元组(cap – fnum * s,fnum * c,bnum)
- t:t – bnum * fnum
- 当t > 0时,做以下操作
- ans:0
- 对于options的排序列表中的每个三元组(left_cap,bcost,bnum),执行以下操作:
- bfill:k和bnum的最小值
- ans:ans + bcost * bfill
- k:k – bfill
- 如果k与0相同,则
- 从循环中出来
- return ans
例子
让我们看看以下实现,以更好地理解-
def solve(fruits,k,cap):
options = []
for c,s,t in fruits:
while t> 0:
fnum = min(cap // s,t)
如果fnum == 0:
打破
bnum = t // fnum
options.append ((cap-fnum * s,fnum * c,bnum))
t -= bnum * fnum
ans = 0
for left_cap,bcost,bnum在排序选项中:
bfill = min(k,bnum)
ans + = bcost * bfill
k -= bfill
如果k == 0:终止
返回ans
fruits = [[5,2,3],[6,3,2],[2,3,2]]
k = 2
cap = 4
print(solve(fruits,k,cap))
输入
[[5,2,3],[6,3,2],[2,3,2]],2,4
输出
12