强盗分赃问题的计算机求解(四)

2014-11-24 10:39:58 · 作者: · 浏览: 2
s = k + 1;
break;
}
}
for (int k = j; k < i; ++k)
{
if (((Robber)preres[k]).coins > midCoins)
{
d = k;
break;
}
}
for (int k = 0; k < s; ++k)
{
((Robber)preres[k]).coins++;
sum += ((Robber)preres[k]).coins;
}
int n = d - s, r = j - s;
int[] a = new int[r + 1];
int[] m = new int[r + 1];
for (int k = 1; k <= r; ++k)
{
a[k] = k;
m[k] = n - r + k;
}
int sum1 = sum, L = 0;
ArrayList preres1 = new ArrayList();
foreach (Object obj in preres)
{
Robber ro = new Robber(((Robber)obj).id, ((Robber)obj).coins);
preres1.Add(ro);
}
for (int k = s; k < s+r ; ++k)
{
((Robber)preres1[k]).coins++;
sum1 += ((Robber)preres1[k]).coins;
}
for (int k = s + r; k < i; ++k)
{
((Robber)preres1[k]).coins = 0;
}
preres1.Add(new Robber(i + 1, CoinNum - sum1));
preres1.Sort(new RobberIdCom());
bool exist = false;
foreach (Object obj in temppre)
{
if (resEqual(preres1, (ArrayList)obj, i + 1))
{
exist = true;
break;
}
}
if (!exist)
{
temppre.Add(preres1);
}
while (!isMax(a, m, r))
{
sum1 = sum;
L = 0;
for (int k = r; k > 0; --k)
{
if (a[k] < m[k])
{
a[k]++;
L = a[k] + 1;
for (int p = k + 1; p <= r; p++)
{
a[p] = L;
L++;
}
break;
}
}
preres1 = new ArrayList();
foreach (Object obj in preres)
{
Robber ro = new Robber(((Robber)obj).id, ((Robber)obj).coins);
preres1.Add(ro);
}
for (int p = 1; p <= r; ++p)
{
for (int k = s; k < d; ++k)
{
if (k == a[p] + s - 1)
{
((Robber)preres1[k]).coins++;
sum1 += ((Robber)preres1[k]).coins;
}
else
{
((Robber)preres1[k]).coins = 0;
}
}
}
for (int k = d; k < i; ++k)
{
((Robber)preres1[k]).coins = 0;
}
preres1.Add(new Robber(i + 1, CoinNum - sum1));
preres1.Sort(new RobberIdCom());
exist = false;
foreach (Object obj in temppre)
{
if (resEqua