{
ArrayList pre = null;
if (finished == null)
{
//如果第1次进行计算
finished = new ArrayList();
pre = new ArrayList();
ArrayList tmp = new ArrayList();
tmp.Add(new Robber(1, CoinNum));
pre.Add(tmp);
finished.Add(pre);
if (robberNum == 1)
{
return pre;
}
}
else if (finished.Count >= robberNum)
{
//如果已有计算结果
return (ArrayList)(finished[robberNum - 1]);
}
else
{
//如果有1个较接近的计算结果
pre = (ArrayList)finished[finished.Count - 1];
}
for (int i = finished.Count; i < robberNum; ++i)
{
//已有若干组i个强盗的分配方案
ArrayList tmppre = new ArrayList();
foreach (Object obj in pre)
{
//已有1组i个强盗的分配方案
ArrayList preres = (ArrayList)obj;
DoNexRes(ref tmppre, preres, i);//产生下一个强盗的分配方案添加tmppre中
}
pre = tmppre;
finished.Add(pre);
}
return pre;
}
private void button_Divide_Click(object sender, EventArgs e)
{
try
{
int robberNum = int.Parse(textBox_RobberNum.Text);
if (robberNum <= 20 && robberNum >= 3)
{
ArrayList results = DoDivide(robberNum);
int i = 0;
listView_DivideRes.Items.Clear();
foreach (Object obj in results)
{
ArrayList result = (ArrayList)obj;
ListViewItem item = new ListViewItem((++i).ToString());
String str = "";
foreach (Object obj2 in result)
{
str += ((Robber)obj2).coins.ToString() + ",";
}
item.SubItems.Add(str.Substring(0, str.Length-1));
listView_DivideRes.Items.Add(item);
}
}
else
{
throw new Exception("强盗人数须在[3, 20]之间");
}
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
private void DoNexRes(ref ArrayList temppre, ArrayList preres0, int i)
{
int sum = 0;//分给别的强盗的金币数
ArrayList preres = new ArrayList();
foreach (Object obj in preres0)
{
Robber ro = new Robber(((Robber)obj).id, ((Robber)obj).coins);
preres.Add(ro);
}
preres.Sort(new RobberCoinsCom());
int j = (i + 1) / 2;
int midCoins = ((Robber)preres[j - 1]).coins;
int s = j - 1, d = j;
for (int k = j - 2; k >= 0; --k)
{
if (((Robber)preres[k]).coins < midCoins)
{