Алгоритм распределения конфет между детьми)
Есть рандомное количество конфет. Нужно вывести все возможные варианты распределения этих конфет между 3мя детьми. Натолкните, пожалуйста, на мысль.
static void Main()
{
Random rnd = new Random();
int prize = rnd.Next(0, 100); // конфеты
int[] arr = new int[3] {0, 0, 0}; // дети
....
foreach (int q in arr) Console.Write((int)q + " ");
Console.WriteLine();
}
Если, например, конфеты - 4, то в итоге должно получиться что-то вроде:
- 4 0 0
- 3 1 0
- 3 0 1
- 2 2 0
- ...
- 0 0 4
Ответы (3 шт):
решите вложенную задачу (через рекурсию)
есть N детей и X конфет
- первый ребенок получает
y=1..X-N+1конфет - для каждого случая вызываем тот же алгоритм, но уже для
N - 1детей иX - yконфет - подсчет всех случаев считаем по последнему ребенку
Кстати отсюда можно вывести и общую формулу ;-)
1 ребенок получает X - N + 1 вариантов конфет
2 ребенок получает (X - N + 1) - 1 вариантов конфет (детей стало на 1 меньше
и т.д.
и получится простая формула в которой будет присутствовать вот такой символ !
Так как C# я не знаю, считайте, что это псевдокод :) — вывод допишите сами.
for(int i1 = 0; i1 <= N; ++i1)
for(int i2 = 0; i2 <= N - i1; ++i2)
// Вывести i1, i2, N - i1 - i2
Вот на С++: https://ideone.com/YI5ncr
Если не ошибся, то общее число способов разделить x конфет между n детей -
т.е. для трех детей x конфет — (x+2)*(x+1)/2.
Простой цикл, распределит конфеты и возможные остатки выкинет
var rand = new Random();
var n = rand.Next(1, 10);
Console.WriteLine($"всего конфет {n}");
for(int i=0; i<=n; i++)
for(int j=0; j<=(n-i); j++)
for(int k=0; k<=(n-i-j); k++)
Console.WriteLine($"{i} {j} {k}");
Вывод
всего конфет 1
0 0 0
0 0 1
0 1 0
1 0 0
Если нужно, чтобы сумма кофет у детей была всегда равна N
var rand = new Random();
var n = rand.Next(1, 10);
Console.WriteLine($"всего конфет {n}");
for(int i=0; i<=n; i++)
for(int j=0; j<=(n-i); j++)
Console.WriteLine($"{i} {j} {n-i-j}");
Вывод
всего конфет 3
0 0 3
0 1 2
0 2 1
0 3 0
1 0 2
1 1 1
1 2 0
2 0 1
2 1 0
3 0 0
