У меня есть пользователь, который вводит набор чисел в диапазоне от 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, 8, 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;
}