Блог им. kal1shaИмитация покупки

image
Сделал скрипит, который выбирает продукты по заданному кол-ву денег. Но учитывается, чтобы вес (цена) продукта был как можно больше и чтобы потратили всё до копейки. Использовал динамическое программирование, т.е. разбил задачу на под задачи. Алгоритм которые использовал, называется «Банкомат».

Опишу сердце скрипта:


<?php
$simple2IdLeft=$_GET['simple2IdLeft'];

$MAX=1000000000; //если не можем потратить всё до копейки
$n=$simple2IdLeft; // деньги клиента 
$k=10; //кол-во наших товаров
	
//очень важна сортировка, если например мы их из бд выбираем
//вес (цена) товара
$a[0]=1;
$a[1]=5;	
$a[2]=10;
$a[3]=60;
$a[4]=100;
$a[5]=180;
$a[6]=250;
$a[7]=550;
$a[8]=1000;
$a[9]=1500;
	
//название продуктов
$product[$a[0]]="мороженое";	
$product[$a[1]]="футболка";
$product[$a[2]]="дыня";
$product[$a[3]]="мячик";
$product[$a[4]]="мышка";	
$product[$a[5]]="велосипед";
$product[$a[6]]="мопед";
$product[$a[7]]="компьютер";
$product[$a[8]]="машина";	
$product[$a[9]]="инвайт на Хабр!";	
	
	for ($m=1;$m<=$n;++$m) //помечаем, что F[m] выдать нельзя
	{
		$F[$m]=$MAX;
		for ($i=0;$i<$k;++$i) //перебираем номиналы банкнот
		{
			if ($m>=$a[$i] && $F[$m-$a[$i]]+1<$F[$m]) 
			{
				$F[$m]=$F[$m-$a[$i]]+1; //изменяем значения, если нашли лучший выбор
			}
		}
	}
	$m=0;
print "Ваша сумма: <b><font color='green'>".$simple2IdLeft."</font></b>
";	
 if ($F[$simple2IdLeft]==$MAX || $simple2IdLeft==0) 
 {
	print "<font color='red'>Пробуй другие значения</font>"; //не можем потратить всё до копейки
 }
 else 
 { 
   print "<i>
На эту сумму вы можете купить:</i>"; 
   while($n>0) 
   {
     for($i=0;$i<$k;++$i) //бежим по номиналам
	{
		   if($F[$n-$a[$i]]==$F[$n]-1) //наш товар
		   { 
				$answer[$m]=$product[$a[$i]]; 
				$n-=$a[$i];	
				$m++;				
				break; 
		   } 
     } 
   }
 }
$cnt=1;
//простой вывод и сразу считаем кол-во товара в штуках
 for ($i=1;$i<=$m;$i++)
 {
	if ($answer[$i-1]!=$answer[$i])
	{
		print $cnt." шт.  - ".$answer[$i-1];
		$cnt=1;
	}
	else
	{
		$cnt++;
	}
 }

?>

скачать код
  • +3
  • kal1sha
  • 31 августа 2009, 11:43

Комментарии (10)

  • avatar
  • fog
  • 31 августа 2009, 18:01
  • #
  • 4
Ничо не понял, что это такое и зачем это надо?
Например, человек занимается покупками деталей для компьютера. Он хочет скупиться на сумму которая у него есть и взять как можно больше и дорогое железо.
А, спасибо, вроде теперь немного понятнее.
Один минус — в данном случае то что он «соберёт» может и не завистись, ровно как и не собраться…
доработать его можно. просто создать матрицу смежности и по ней проверять, можно человеку молоко с огурцом покупать, или нет :-).
Тогда надо еще какой-то коэффициент «рекомендаций» или «популярности» считать. Потому что самое дорогое — не всегда самое лучшее.
плюсанул.
что говорить еще :)
Немного доработать и можно сделать подбор максимально выгодных товаров на определённую сумму…

Например дано:
Денег 10000руб.
Нужно
Оперативу
Видуху
Винт

Задача:
Подобрать максимально лучший товар на данную сумму!
По моему это самая банальная «Задача о рюкзаке» =)
да, но в другой форме)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.