我让用户输入1到19范围内的一组数字......并且需要找到最多可加40的数字,每个数字只能使用一次。
所以说清单是: 19,17,11,13,8,9,7,5,10,16,14,8,7,3。
然后输出应为:
19,11,10
16,14,7,3
17,18,8,7
列表中剩下13,9和5。
我找到了一些建议,但他们似乎只寻找一场比赛,我尝试了自己的比赛,但仍缺乏一些改进。
private void btnCalc_Click(object sender, RoutedEventArgs e)
{
// Copy the list to a new list:
List<int> lookInto = new List<int>();
foreach(int i in weaponList)
{
lookInto.Add(i);
}
int lookFor = 40;
while (lookFor > 0)
{
lookFor = Search(lookInto, lookFor);
}
if (lookFor != -1)
{
listSell.Items.Add(answer);
}
}
private int Search(List<int> hay, int needle)
{
int lowestValue = hay.Min();
int highestValue = hay.Max();
if (hay.BinarySearch(needle) > 0)
{
int index = hay.BinarySearch(needle);
if (answer == "")
{
answer += hay[index].ToString();
needle -= hay[index];
hay.Remove(needle);
}
else
{
answer += ", " + hay[index].ToString();
needle -= hay[index];
hay.Remove(needle);
}
}
if (needle - highestValue > lowestValue || needle - highestValue == 0)
{
if (answer == "")
{
answer += highestValue.ToString();
needle -= highestValue;
hay.Remove(highestValue);
}
else
{
answer += ", " + highestValue.ToString();
needle -= highestValue;
hay.Remove(highestValue);
}
}
else
{
for (int i = 0; i > hay.Count; i++)
{
if (needle - hay[i] == 0 || needle - hay[i] > lowestValue)
{
if (answer == "")
{
answer += hay[i].ToString();
needle -= hay[i];
hay.RemoveAt(i);
}
else
{
answer += ", " + hay[i].ToString();
needle -= hay[i];
hay.RemoveAt(i);
}
}
}
if (needle > 0)
{
needle = -1;
}
}
return needle;
}
答案 0 :(得分:0)
我即将离开并且无法输入实际的代码块,但是您可以这样做:创建一个包含所有数字的镜像静态数组,使用递归函数逐步执行并尝试添加数字从该数组到40,如果它们通过40,它将只返回-1,否则,所有用于达到40的索引,每次返回一组索引时,从镜像数组中删除这些数字所以下一次迭代不会尝试使用它们并将数字添加到集合列表中。当递归函数停止时,你在主数组中留下的是未使用的数字,集合列表将包含所有找到的集合。
我希望这有帮助!