是否可以将具有给定成本的所有物品出售给具有给定金额的人

时间:2017-08-01 11:58:18

标签: algorithm graph graph-algorithm max-flow

最近我遇到了一个真正的问题,我可以将其重新模拟为以下算法任务:

问题:
给定一组N人,每人有一定数量的钱,以及一组M项,每项都有一些费用,是否有可能出售所有物品?

每个项目最多只能由一个人购买,每个人可以购买多件商品,这样他们的成本就不会超过他的金额。

我的尝试解决方案:
我正在思考构建网络的方向并找到这样的最大流量:
- 制作一个二层图,其中一个部分的顶点对应于人,另一部分 - 对应于项目 - 将人员连接到来源S并将边缘容量设置为人们拥有的钱 - 将项目连接到接收器T并将边缘容量设置为项目成本。
- 将每个人连接到他可以购买的物品,并设置物品成本的边缘容量

如果在此网络中找到的最大流量中的每条边缘都是空的或完全饱和,那么问题将通过查看到T的所有边是否已经饱和来解决,如果我们想知道谁应该买什么项目我们会看左右两边的边缘。

然而问题是所产生的流量可能包含部分填充的边缘(意味着一个人部分支付了某些项目),这种情况我无法消除。

2 个答案:

答案 0 :(得分:0)

显然,这是一种Bin Packing Problem

另见Multiple knapsack problem

答案 1 :(得分:0)

多背包可以准确地解决这个问题,但绝对是一种矫枉过正,因为所有元素具有相同的重量(这是从背包的角度来看的价值)。

我的直觉建议使用贪婪的算法,在每次迭代中,你试图将最昂贵的物品出售给目前仍然负担得起的最穷的人。它基于这样一种信念,即如果你不能在销售更便宜的产品之前卖掉它,你就不会卖掉它。此外,首先耗尽较贫穷买家的预算将使其他人有更多权力购买更昂贵的物品。我想你有足够的测试数据来验证它。