Алгоритм распределения конфет между детьми)

Есть рандомное количество конфет. Нужно вывести все возможные варианты распределения этих конфет между 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 шт):

Автор решения: Zhihar

решите вложенную задачу (через рекурсию)

есть N детей и X конфет

  1. первый ребенок получает y=1..X-N+1 конфет
  2. для каждого случая вызываем тот же алгоритм, но уже для N - 1 детей и X - y конфет
  3. подсчет всех случаев считаем по последнему ребенку

Кстати отсюда можно вывести и общую формулу ;-)

1 ребенок получает X - N + 1 вариантов конфет

2 ребенок получает (X - N + 1) - 1 вариантов конфет (детей стало на 1 меньше

и т.д.

и получится простая формула в которой будет присутствовать вот такой символ !

→ Ссылка
Автор решения: Harry

Так как 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.

→ Ссылка
Автор решения: tym32167

Простой цикл, распределит конфеты и возможные остатки выкинет

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
→ Ссылка