我有以下算法/面试问题:
假设我需要准备饼干盒,每个饼干盒都包含符合特定卡路里范围的特定数量的饼干。说
box1: 100 biscuits, calorie 200-300 box2: 200 biscuits, calorie 190-250 box3: 100 biscuits, calorie 280-220
可用的饼干是:
50 biscuits with calorie 200 250 biscuits with calorie 230 100 biscuits with calorie 190
找到一种方法来准备所有饼干盒或证明没有解决方案。
想了一会但却找不到好的解决方案。贪心算法似乎在这里没有任何提示吗?
答案 0 :(得分:1)
我认为您可以使用贪婪算法执行此操作,如下所示:
因此,对于您的示例,排序顺序(按上限):
box2: 200 biscuits, calorie 190-250
box3: 100 biscuits, calorie 220-280
box1: 100 biscuits, calorie 200-300
和饼干:
100 biscuits with calorie 190
50 biscuits with calorie 200
250 biscuits with calorie 230
然后放置
100 calorie 190 biscuits into box2
50 calorie 200 biscuits into box2
50 calorie 230 biscuits into box2 (only 50 because box2 becomes full)
100 calorie 230 biscuits into box3 (only 100 because box3 becomes full)
100 calorie 230 biscuits into box1
假设所有卡路里低于W的饼干都以最佳方式放入盒子中。
然后考虑卡路里等于W的饼干。如果可以选择这个重量的盒子,那么选择上限最小的盒子永远不会阻止我们放置剩余的饼干。
答案 1 :(得分:0)
此问题可以简化为最大流量搜索。
让我们构建一个二分图:第一组顶点将对应饼干(每个饼干的一个顶点)。第二组以相同的方式对应于框。如果饼干具有适当的卡路里值,则在第一组的顶点和第二组的顶点之间存在具有无限容量的边缘。来自第一组的源和每个顶点之间存在边缘,其容量等于这种饼干的数量。在第二组和水槽之间的每个顶点之间还有一条边,其容量等于盒子的大小。
之后可以找到源和接收器之间的最大流量,并检查所有盒子是否已满。
此解决方案具有多项式时间和空间复杂度。
答案 2 :(得分:-2)
你需要一个算法吗?
如果没有,只需将100卡路里的卡路里190放入盒子2,将50卡路里的卡路里200放入盒子1中,然后将250块饼干和卡路里230分成2盒和3盒。