首先,它很容易看到问题的概括是NP-Hard,并且是从Knapsack Problem瞬间reduceable:
给定一个背包问题:weight=W, costs_of_items=C, weight_of_items=X
,问题减少到了这个问题,在没有任何限制玩家人数(推广最多k
玩家,其中k
由您选择)。
因此,我们可以得出结论,没有已知的问题多项式时间解决方案。
但是,我们可以开发基于knapsack pseudo-polynomial solution的解决方案。
为简单起见,假设我们只限制小前锋的数量(答案的原则可以用来增加更多的限制)。
然后,该问题可以通过以下递归方法来解决:
if i is not a forward, same as the original knapsack, while maintaining the #forwards
f(i,points,forwards) = max {
f(i-1,points-C[i],forwards)
f(i-1,points,forwards)
}
if i is a forward:
f(i,points,forwards) = max {
//We used one of the forwards if we add this forward to the team
f(i-1,points-C[i],forwards-1)
f(i-1,points,forwards)
}
基部将是全零,其中维度之一是零:f(0,_,_)=f(_,0,_)=0
(同常规背包)和f(_,_,-1)=-infnity
(无效溶液)
答案将是f(2,W,n)
(2表示转发次数,如果不同,应该改变)。 W
是工资帽和n
是玩家人数。
DP解决方案将自下而上地填充表示递归的矩阵以获得伪多项式时间解(只有在限制恒定时才是伪多项式)。
通过重复此过程,并且为每个标准添加一个维度,DP解决方案将优化解决此问题。
你会得到的复杂性是O(B^p * W * n)
- 其中:
B
是“分支因子” - 每个位置+ 1(对于零)的球员在你的情况B=3
数量。
W
=工资帽
n
=玩家人数从
选择。如果您发现最佳的解决方案过于耗费时间,我建议去为启发式解决方案,如hill climbing或Genetic Algorithms,尽可能多地尝试优化结果,但不能保证找到全局最大值。
没有最后一个约束,问题可以很容易地简化为[背包问题](http://en.wikipedia.org/wiki/Knapsack_problem),它有一个伪多项式时间解。 – amit
詹姆斯,威廉姆斯,马克当然更好 - 9500美元,65分? – Chowlett
每个玩家只能玩一个位置,对吧? –