<p>一种与您介绍的示例相一致的算法如下:</p>
<ol>
<li><p>让平均战利品是攻击者的潜力除以防御者的非零资源。循环查看防御者的非零资源,如果其中任何资源小于或等于平均战利品,则将其从防御者中移除并交给攻击者。</p></li>
<li><p>如果在步骤1中遇到并移动了小于或等于平均战利品的资源,则重新计算平均战利品并重复步骤1。否则,继续执行步骤3。</p></li>
<li><p>如果防御者有剩余资源,最后再计算他们的资源。</p></li>
</ol>
<p>python中可能的实现如下:</p>
<pre><code>def step1(dres, aloot, potential):
again = False
ndres = {}
if len(dres) > 0:
avgloot = int(potential / len(dres))
for r in dres:
if dres[r] <= avgloot:
potential -= dres[r]
aloot[r] += dres[r]
again = True
else:
ndres[r] = dres[r]
return (ndres, aloot, potential, again)
def calculate_loot(dres, potential):
aloot = {'wood':0, 'iron':0, 'wheat':0, 'gold':0}
(dres, aloot, potential, again) = step1(dres, aloot, potential)
while again:
(dres, aloot, potential, again) = step1(dres, aloot, potential)
if len(dres) > 0:
avgloot = int(potential / len(dres))
for r in dres:
aloot[r] += avgloot
return aloot
potential = 250
for dres in [
{'wood':100, 'iron':25, 'wheat':76, 'gold':50000},
{'wood':2500, 'iron':2500, 'wheat':5000, 'gold':5000 },
{'wood':100, 'iron':0, 'wheat':1, 'gold':0 },
{'wood':0, 'iron':0, 'wheat':0, 'gold':50000}
]:
print(dres)
print(calculate_loot(dres, potential))
print(' ')
</code></pre>
<p><a href="http://ideone.com/1S2QMQ" rel="nofollow">Online Demo</a></p>