|
|
1
9
问题是强NP完全的。这意味着无法在合理的时间内确保正确的解决方案。(见 3-partition-problem 谢谢保罗。 相反,你需要一个好的近似解生成器。这通常可以在很短的时间内得到非常接近最优的答案。我可以推荐 Simulated Annealing 这项技术,你也可以用它来解决很多其他的NP完全问题。 想法是:
这个解决方案比许多人建议的“贪婪”算法强大得多。贪婪算法是一种不断地向“最穷”玩家添加最大项目的算法。贪婪失败的测试用例的一个例子是
我为您执行了SA。出于教育目的,它严格遵循wiki文章。如果你优化它,我会说100倍的改进是不现实的。
更新: 在玩过分支界之后,我现在相信这种方法是优越的,因为它在一秒钟内为n=30,m=6的情况提供了完美的结果。不过,我想你也可以使用模拟退火方法。 |
|
|
2
2
一些人提出的贪婪的解决方案似乎是最好的选择,我用一些随机值运行了很多次,每次都是正确的。
|
|
|
3
1
这个怎么样? 排序k值。 命令玩家。 循环K值,将下一个值给下一个玩家。 当你到达玩家的终点时,转身继续向相反方向的玩家提供K值。 |
|
|
4
1
重复地将具有最大值的可用对象提供给具有分配给他的对象的最小总值的玩家。 |
|
|
5
1
这是Justin Peel答案的直接实现:
我是一个初学巨蟒的人,但它似乎工作正常。此示例将打印
|
|
|
6
0
30^6不是那么大(少于10亿)。通过每一个可能的分配,并选择一个最公平的衡量你定义。 |
|
|
7
0
编辑: 其目的是使用贪婪的解决方案,并在实现上稍作改进,这在C中可能是透明的:
关于这个阶段:
其思想是列表总是被排序(在这个代码中,它是由orderby完成的)。最终,这种排序不会超过o(log(n))——因为我们只需要在排序列表中插入至多一个项目——这应该和二进制搜索一样。 因为我们需要对sortedValues.length times重复这个阶段,所以整个算法在o(m*log(n))中运行。
因此,用词来说,它可以改为:
重复以下步骤,直到完成
步骤4是O(log(n))步骤,因为列表总是被排序的。 |
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |