试图弄清楚要使用的算法

时间:2011-05-01 21:29:43

标签: java algorithm

你有输入游戏。 每个游戏都有一个名气(可能是负面的)和必备游戏(这些游戏必须在你玩当前游戏之前播放)。

你想通过玩一套有效的游戏来找到你可以获得的最大名望。

我的一个想法是使用加权有向图,但是你仍然需要尝试图中的每一对节点来找到最佳解决方案。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

你有最多可以玩的游戏吗?然后,它听起来像是背包问题http://en.wikipedia.org/wiki/Knapsack_problem的变体(在文章中找到问题的一些方法,即使问题是NP完全的,因此原则上不能有效解决)。

如果你可以玩任意数量的游戏,那么它在计算意义上仍然很难。 对于每个必备游戏,您可以通过添加其启用的游戏的名声来计算您获得的点数。当然,这些都会随着您玩的每个先决条件而发生变化,因为后来的先决条件可能会启用已由先前先决条件启用的游戏,从而降低了他们提供的名望。我猜你仍然坚持尝试所有2 ^ p组合的前提条件游戏。

答案 1 :(得分:0)

也许一个A* algorithm可以帮助你,也就是说你在图表中为每条路线做出有根据的猜测(对于那条路线来说是最低的名气),按照最有希望的一条路线,如果你看到它低于猜测一条尚未开出的路线,沿着这条新路线行驶并停在这里。

答案 2 :(得分:0)

以下方法适用于具有非负边的图: 由于游戏之间存在依赖关系,因此图形是非循环的。您可以否定图中的所有边,并在P时间内找到最短路径。然后,这将在原始图表中给出最长的路径。

编辑:

因为,图形是非循环的,最短路径也适用于负边缘。请参阅http://algs4.cs.princeton.edu/44sp/

中DAG中的最短/最长路径