Скажите, что есть x количество ящиков, каждая коробка содержит «инвентарь» букв A-Z, каждый из которых содержит 1 или более букв.Как реализовать такой алгоритм?
Теперь предположим, что мне нужно следующее:
- 6 Как
- 2 Bs
- 1 C
Как получить список всех возможных комбинации/перестановкой коробки что может предоставить мне письма, которые мне нужны?
Алгоритм должен также создавать комбинацию ящиков для удовлетворения моих требований. Например: скажем, что Box-1 имеет только 4 As и Box-2 имеет 1 A и Box-3 имеет 1 A, мне нужен результат алгоритма, чтобы указать, что 6 As может быть выполнено через 3 поля.
Какова основная логика решения такой проблемы. Есть ли какие-то конкретные алгоритмы, которые мне нужно изучать?
EDIT 1:
За предложение DCP, вот это моя попытка, что реализации PHP:
$boxes = array(
// box 1
array(
'A' => 6,
'B' => 4,
'C' => 10
),
// box 2
array(
'A' => 8,
'B' => 4,
'C' => 2
),
// box 3
array(
'A' => 1,
'B' => 1,
'C' => 0
)
);
$n = count($boxes);
for ($mask = 0; $mask <= (1 << $n) - 1; $mask++)
{
$tots = array();
for ($i = 0; $i < $n; $i++)
{
if (((1 << $i) & $mask) != 0)
{
// this is a selected box for this mask, add the A's, B's etc. for this box to the total
$tots[0] += $boxes[$i]['A'];
$tots[1] += $boxes[$i]['B'];
$tots[2] += $boxes[$i]['C'];
}
// check the tots array to see if it meets the letter requirements. If it does,
// then this is a valid combination of boxes.
}
}
Не могли бы вы предоставить какой-нибудь фон? Почему вам нужны ВСЕ комбинации? Это не кажется полезным, поскольку после перечисления случаев у вас нет критериев для его выбора. Если это не любопытство ... или домашнее задание. –
@belisarius: не нужно выбирать критерии для выбора. Возможно, проблема решена с выявленной комбинацией. Кроме того, почему только две возможные причины, почему я задаю этот вопрос, - это «любопытство» или «домашнее задание»? Разве это не проблема, над которой я работаю? – StackOverflowNewbie
О да, конечно! Поскольку это сайт «дайте и возьмите», я просто прошу вас поделиться наиболее публичной частью обоснования вашего вопроса, просто чтобы помочь другим распознать проблему, ответы на которые вы можете получить. Действительные ответы: {my problem is ...}, {just curiosity}, {не ваш бизнес}. Однако последнее не помогает. –