[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: помогите придумать алогоритм/функцию
alexfbm
Привет всем. Народ, помогите создать несложный вроде бы алогоритм.
нужно рассчитать все возможные варианты.

пример:

2 доллара = 1 пиво, 0 лимонада, всего 1 продукт
2 доллара = 1 пиво, 1 лимонад, всего 2 продукта
2 доллара = 1 пиво, 2 лимонада, всего 3 продукта
2 доллара = 2 пива, 0 лимонада, всего 2 продукта
2 доллара = 2 пива, 1 лимонад, всего 3 продукта
2 доллара = 0 пива, 1 лимонанд, всего 1 продукт
2 доллара = 0 пива, 2 лимонанда, всего 2 продукта
2 доллара = 0 пива, 3 лимонанда, всего 3 продукта


X (доллары) А (пиво), B (лимонад), C = всего продуктов

условия:
число A меньше либо равно X
число B меньше либо равно X+1
число C, если B равно 0, меньше либо равно числу X
число C, если B больше 1, меньше либо равно числу X+1
число X это одно из 0, 2, 4, 6, 8, 10


доллары, пиво, лимонад - это все для примера, в задаче другие данные.
нужна такая функция которой передашь число X, она возвратит все варианты

типа count_variants(2) и выдала все варианты, которые я расписал выше.

на картинке варианты для X=0, X=2, X=4

user posted image



Спустя 3 минуты, 15 секунд (24.05.2012 - 21:39) Игорь_Vasinsky написал(а):
а если С = 1 000 000 000 ?

Спустя 5 минут, 43 секунды (24.05.2012 - 21:45) alexfbm написал(а):
Цитата (Игорь_Vasinsky @ 24.05.2012 - 18:39)
а если С = 1 000 000 000 ?

C таким не может быть, т.к. максимальный X = 10.

Спустя 5 минут, 57 секунд (24.05.2012 - 21:51) johniek_comp написал(а):
не понял сути задачи, объясни ещё раз

Спустя 7 минут, 24 секунды (24.05.2012 - 21:58) alexfbm написал(а):
Цитата (johniek_comp @ 24.05.2012 - 18:51)
не понял сути задачи, объясни ещё раз

ну вообщем за 2 доллара ты можешь получить не больше 2 бутылок пива (А <= X), не больше 3 бутылок лимонада (B <= X+1). Но ты можешь комбинировать и получить например 1 пиво и 1 лимонанд, 2 пива и один лимонад, 2 пива и 0 лимонада. или даже минимум одно пиво, либо один лимонад. Варианты описаны выше, как можно получить продукты за 2 доллара.
не знаю как еще объяснить, дурацкая задача.

Спустя 12 минут, 47 секунд (24.05.2012 - 22:11) inpost написал(а):
$array = array();
$money = 2;
$beer = 0.5;
$limonad = 0.5;
$beer_move = 2/0.5; // 4(!);
$limonad_move = 2/1; // 2(!);
for($i = 0; $i<=$beer_move; $i++) {
// Обходим первый товар!
for($i2=0; $i2<=$limonad_move; $2++) {
if($money-$i*$beer-$limonad*$i2 < 0) {
$array[] = array($i,0);
// echo 'Пиво: '.$i.', Лимонад: 0';
} else {
$array[] = array($i,(int)(($money-$i*$beer)/$limonad)); // echo 'Пиво: '.$i.', Лимонад: 0';
//echo 'Пиво: '.$i.', Лимонад: '.(int)(($money-$i*$beer)/$limonad);

}
}
}

Тоже самое в обратном порядке, дубли удалить.

Спустя 3 минуты, 31 секунда (24.05.2012 - 22:15) inpost написал(а):
Обычная задачка на логику. Советую тренироваться головой, очень важно программистам искать такие вот решения.
Если много товаров (не 2), то глубину вложенности делать придется больше, это ведь тупо перебор всего, чего только можно.

Спустя 6 минут, 11 секунд (24.05.2012 - 22:21) alexfbm написал(а):
Цитата (inpost @ 24.05.2012 - 19:11)
$array = array();
$money = 2;
$beer = 0.5;
$limonad = 0.5;
$beer_move = 2/0.5; // 4(!);
$limonad_move = 2/1; // 2(!);
for($i = 0; $i<=$beer_move; $i++) {
// Обходим первый товар!
for($i2=0; $i2<=$limonad_move; ++) {
if($money-$i*$beer-$limonad*$i2 < 0) {
$array[] = array($i,0);
// echo 'Пиво: '.$i.', Лимонад: 0';
} else {
$array[] = array($i,(int)(($money-$i*$beer)/$limonad)); // echo 'Пиво: '.$i.', Лимонад: 0';
//echo 'Пиво: '.$i.', Лимонад: '.(int)(($money-$i*$beer)/$limonad);

}
}
}

Тоже самое в обратном порядке, дубли удалить.

что то неправильно работает у тебя, получается что за 2 бакса можно взять аж 4 пива (пиво <= баксы), а так же можно взять 4 лимонада (лиманд <= баксы+1)

Спустя 1 минута, 9 секунд (24.05.2012 - 22:22) alexfbm написал(а):
у меня только что вот что получилось, вроде работает... надо еще потестить.


function calc_variations($x)
{
$variants = array();

$a = 0;
$c = 0;
$b = 0;

for ($a = 0; $a <= $x; $a++)
{
for ($b = 0; $b <= $x + 1; $b++)
{
$c = $a + $b;

if ($c > $x+1 && $a > 0) continue;

$variants[] = "$x dollara, $a pivo, $b limonad, vsego $c produkt";
}
}


return $variants;
}

$variants = calc_variations(2);

Array
(
[
0] => 2 dollara, 0 pivo, 0 limonad, vsego 0 produkt
[1] => 2 dollara, 0 pivo, 1 limonad, vsego 1 produkt
[2] => 2 dollara, 0 pivo, 2 limonad, vsego 2 produkt
[3] => 2 dollara, 0 pivo, 3 limonad, vsego 3 produkt
[4] => 2 dollara, 1 pivo, 0 limonad, vsego 1 produkt
[5] => 2 dollara, 1 pivo, 1 limonad, vsego 2 produkt
[6] => 2 dollara, 1 pivo, 2 limonad, vsego 3 produkt
[7] => 2 dollara, 2 pivo, 0 limonad, vsego 2 produkt
[8] => 2 dollara, 2 pivo, 1 limonad, vsego 3 produkt
)




Спустя 1 минута, 4 секунды (24.05.2012 - 22:23) inpost написал(а):
Что неправильно?
2 доллара, каждый из товаров стоит 0.5. = 4 банки

Спустя 1 минута, 50 секунд (24.05.2012 - 22:25) alexfbm написал(а):
Цитата (inpost @ 24.05.2012 - 19:23)
Что неправильно?
2 доллара, каждый из товаров стоит 0.5. = 4 банки

нету никакой 0.5, где ты взял это вообще? забудь про доллары и пиво. это я от балды придумал. там вообще логика в одной из игр при некоторый действиях. есть просто числа, при которых другие числа могут быть именно такими. формулу примерную, условия я написал (X, A, B, C)

Спустя 1 минута, 57 секунд (24.05.2012 - 22:27) inpost написал(а):
Мой вариант вернёт тебе:
0/4
1/3
2/2
3/1
4/0

Ты получил допустимое максимальное значение второй величины. Далее тебе надо просто проставить через range варианты от 0 до MAX, который мы ранее определили.

Спустя 20 минут, 43 секунды (24.05.2012 - 22:48) redreem написал(а):
погугли "перестановки сочетания" - все давно уже решено.

Спустя 13 минут, 1 секунда (24.05.2012 - 23:01) alexfbm написал(а):
Цитата (inpost @ 24.05.2012 - 19:27)
Мой вариант вернёт тебе:
0/4
1/3
2/2
3/1
4/0

Ты получил допустимое максимальное значение второй величины. Далее тебе надо просто проставить через range варианты от 0 до MAX, который мы ранее определили.

а можешь сам поставить пределы в коде и чтобы функция выдала подобный ответ, как моя? просто трудновато разобраться в чужом коде - у тебя там перемножения, вычитания, деления происходят, не очень понятно)) интересно просто, работает ли такой мудреный код))

Спустя 10 часов, 33 минуты, 34 секунды (25.05.2012 - 09:34) Invis1ble написал(а):
комбинаторика же
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.