寻找最佳组合的算法

时间:2011-10-07 21:33:23

标签: algorithm combinations

所以,我有12个列表,每个列表包含28个带值的项目。

我试图通过使用其他11个列表切换项目来最大化第一个列表的值。

我也可以交易不同数量的物品。例如,我可以从列表1交换6个项目,从列表2交换3个项目。或者,我可以从列表1交易19个项目,从列表2交换22个项目。大型池中还有其他项目不属于列表,因此,如果列表收到超过28个项目,则可以轻松删除最低值,如果列表少于28个项目,则可以轻松添加新项目。

然而,一个限制是我一次只能交易一个清单。例如,我不能将列表1中的3个项目交换到列表2,将列表2中的3个项目交换到列表3,并将列表3中的3个项目交换到列表1.当我从列表1交易时,我只能一次只交换一个列表。

我显然可以蛮力这个,但我觉得这需要永远。我的组合不是很好,所以如果我想暴力,我不确定会有多少种不同的组合。

所以我的问题是,在这里强制推行一个可行的解决方案,如果没有,那么算法的一个例子可以帮助我吗?

谢谢,Krzys。

编辑:

示例:

List 1
[Apple - 12]
[Banana - 5]
[Orange - 8]

List 2
[Steak - 15]
[Chicken - 2]
[Fish - 7]

List 3
[Zebra - 20]
[Horse - 6]
[Elephant - 10]

所以我将从列表1开始。这是程序将要做的事情:

if (List1.Apple - List2.Steak < BestTradeAvailable) Then BestTradeAvailable = List1.Apple - List2.Steak
if (list1.Apple - List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = list1.Apple - List2.Chicken
if (list1.Apple - list2.Fish < BestTradeAvailable) Then BestTradeAvailable = list1.Apple - list2.Fish
if (list1.Banana - List2.Steak < BestTradeAvailable) Then BestTradeAvailable = list1.Banana - List2.Steak
if (list1.Banana - List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = list1.Banana - List2.Chicken
if (list1.Banana - List2.Fish < BestTradeAvailable) Then BestTradeAvailable = list1.Banana - List2.Fish

等 我也希望一次做多个项目,所以:

if (list1.Apple + list1.Banana - List2.Steak + List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = list1.Apple + list1.Banana - List2.Steak + List2.Chicken

但正如我之前所说,你可以交换清单1中的一项和清单2中的两项:

if (list1.Apple - List2.Steak + List2.Chicken < BestTradeAvailable) Then BestTradeAvailable = List1.Apple - List2.Steak + List2.Chicken

所以基本上,我只想尝试找到最好的交易。

在这个例子中,最好的交易是交易Apple + Orange到List3的Zebra和Elephant,因为这个交易增加了List1的总价值最高金额。

2 个答案:

答案 0 :(得分:0)

基本上你需要对列表进行排序并占据前28名吗?

优先队列可行。

答案 1 :(得分:0)

强力解决方案只需要O(n ^ 2 *(m-1))时间复杂度,其中n是列表中的项目数,m是列表数。如果你想寻找所有的组合,它将是O(n ^ 2 *(n-1)*(m-1))时间复杂度,你只需要尝试232848种组合。或者所有组合都是n!如果订单也很重要。