Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 门票的分发_C++_Algorithm - Fatal编程技术网

C++ 门票的分发

C++ 门票的分发,c++,algorithm,C++,Algorithm,有n个人。每个人都对一定数量的事件感兴趣。(最多10个)。现在每个人都有一张自己感兴趣或不感兴趣的活动门票 通过交换门票,最多有多少人可以拥有他们感兴趣的活动门票 比如说 感兴趣的人-事件1、事件3 有门票-活动4 B感兴趣的人-事件2、事件4 有门票-活动1 对事件8感兴趣的人员C 有门票-活动4 A和B可以交换车票并参加他们的活动。C不能。所以答案是2 我想知道如何解决这个问题这听起来很像我们在所谓的数学交易中所做的。基本上,这是一种收集每个参与者为交易提供的物品“收集”数据的方法,并对照每

有n个人。每个人都对一定数量的事件感兴趣。(最多10个)。现在每个人都有一张自己感兴趣或不感兴趣的活动门票

通过交换门票,最多有多少人可以拥有他们感兴趣的活动门票

比如说

感兴趣的人-事件1、事件3 有门票-活动4

B感兴趣的人-事件2、事件4 有门票-活动1

对事件8感兴趣的人员C 有门票-活动4

A和B可以交换车票并参加他们的活动。C不能。所以答案是2


我想知道如何解决这个问题

这听起来很像我们在所谓的数学交易中所做的。基本上,这是一种收集每个参与者为交易提供的物品“收集”数据的方法,并对照每个参与者的“需求”进行检查,然后尝试最大化交易量,以便尽可能多的参与者能够收到他们想要的东西

这种方法使交易最大化,因此交易是循环进行的。也就是说,交易不必是直接的,这样一来,人A可能会给人B一些东西,但可能会从人C那里得到一些东西。(像这样的交易涉及大量的信任)

这种循环交易是否适合您的解决方案,或者您只是在寻找直接交易?(A给B,B给A)

如果你想要一个具体的例子,我通常使用的软件叫做TradeMaximizer,它是开源的,所以你可以很容易地在SourceForge上找到它,如果你愿意的话,可以深入研究它


抱歉,如果这不是非常有帮助,第一次发布,无法添加评论

首先要注意的是,谁最初持有罚单并不重要。重要的是票子库能满足多少不同的人。@j_random_hacker,假设人们准备放弃他们想要的票子,以最大化一些不相关的全局功能。@n.m:我明白你的意思--“我的”最佳解决方案可能会导致一个人已经有了一张他们想要的票,不得不将该票换成他们不想要的票。IMHO书面问题并未排除这一点,但OP应澄清这是否可接受。在这种情况下,这是二部最大匹配问题:为每个人在a中创建一个顶点,为每个票证在B中创建一个顶点,并在每个人喜欢票证v时创建一条边(u,v)。您可以使用匈牙利算法或最大流技术在O(n^3)时间内以最佳方式求解。@j_random_hacker:使用匈牙利算法有点极端,因为每条边上都有一个单位权重。更好的算法是福特·富尔克森(Ford Fulkerson)或霍普克罗夫特·卡普(Hopcroft Karp)算法。我不知道这个问题有如此“直接”的意义!喜欢阅读Chris Okasaki对TradeMaximizer中使用的算法的描述:)