excel - 在每个 jar 的最大可能容量下,找到容纳最大数量 Wine 的最少 jar 数

标签 excel algorithm math optimization

我的业务是 Wine 转售业务,我一直在努力解决这个问题。我们有50-70种 Wine 可以随时储存,大约500个不同容量的 jar 。每个 jar 只能装一种酒。我的工作是确定最少数量的 jar 来容纳最多数量的 Wine ,每个 jar 都尽可能接近其最大容量,即如果有 2 个 60 升和 40 升的 jar ,则不应将 100 升的 Wine 储存在 200 升的 jar 中也存在。

我一直在 excel 中手工完成这项工作,并想尝试自动化该过程,但使用宏和数组公式很快就会失控。我可以用 C 和 Swift 编写一个简单的程序,但一直在寻找通用算法。非常感谢您指出我可以从哪里开始。一个完整的解决方案,我会寄给你一瓶 ;)

编辑:澄清一下,我确实知道我有多少种 Wine 及其总量,即 700 升的皮诺、2000 升的梅洛等。这些每周都会变化。然而,这些水箱有许多不同的容量(40、60、80、100、200 升等)并且不定期更换,因为它们必须被取出进行清洁和更换。简单地用70个坦克来容纳70种是不可能的。

此外,酒的总量永远不会与 jar 的总容量相匹配,我需要使用最少数量的 jar 来容纳最大量的酒。如果容量不足,剩余的酒量必须尽可能少(它们会很快变质)。如果有剩余,则每种类型的剩余量必须与其数量成正比。

这个问题的一个简化示例是这样的:

Wine: 
----------
Merlot 100 
Pinot 120 
Tocai 230 
Chardonay 400

Total: 850L

Tanks: 
----------
T1 10 
T2 20
T3 60 
T4 150 
T5 80 
T6 80 
T7 90 
T8 80 
T9 50 
T10 110 
T11 50 
T12 50

Total: 830L

最佳答案

此贪心 DP 算法尝试执行比例拆分:例如,如果您有 700l Pinot、2000l Merlot 和 jar 容量 40、60、80、100、200,即总容量为480

700 / (700 + 2000) = 0.26
2000 / (700 + 2000) = 0.74

0.26 * 480 = 125
0.74 * 480 = 355

因此,我们将尝试存储 125l 的 Pinot 和 355l 的 Merlot,以使存储量与我们拥有的数量成正比。

显然这不是完全可能的,因为你不能混合 Wine ,但我们应该能够接近。

要储存 Pinot,最接近的是使用 jar 1 (40l)3 (80l),然后将其余的用于 Merlot。

这可以实现为 subset sum问题:

d[i] = true if we can make sum i and false otherwise
d[0] = true, false otherwise
sum_of_tanks = 0
for each tank i:
  sum_of_tanks += tank_capacities[i]
  for s = sum_of_tanks down to tank_capacities[i]
    d[s] = d[s] OR d[s - tank_capacities[i]]

计算比例,然后针对您拥有的每种 Wine 运行此程序(移除已经选择的 jar ,您可以使用 d 数组找到它们,如果需要,我可以详细说明)。环顾 d[computed_proportion] 以找到每种 Wine 类型可能达到的最接近的总和。

这对于几百个坦克来说应该足够快了,我猜它的容量不会超过几千个。

关于excel - 在每个 jar 的最大可能容量下,找到容纳最大数量 Wine 的最少 jar 数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31516359/

相关文章:

excel - 复制粘贴不会触发worksheet_change

algorithm - 按出现频率的顺序打印列表唯一项目

java - 如何将 UI 中输入的值调用到 java 类?

python - 筛选 Excel 表格

java - 使用 POI 删除 excel 中的一行

image - Excel VBA自定义函数从URL故障插入图像

algorithm - 递增基于斐波那契的整数的摊销分析

java - 如何使用 HashMap 解决这个问题?

math - 生成维度为 8x8 的正定矩阵

algorithm - 如何以最小的成本使用符号 + * () 和 1 来表示整数?