【发布时间】:2015-06-23 09:18:12
【问题描述】:
我正在做一个小项目,我需要帮助来根据用户的一些输入找到最好和最便宜的门票:
- 在什么期间(开始日期和结束日期)?
- 在此期间,您是否跳过 1 个或多个日期?
- 您每天需要使用多少次票?
有x张票。一张票可以覆盖:
- 单程票,仅限使用一次,售价 5 美元。
- 期间票(每天无限次乘坐),从 1 天/10 美元、3 天/30 美元、7 天/45 美元起,随心所欲地使用。
我想我正在寻找某种算法来确定基于时段(包括或不包括跳过日期)以及它们的价格的最佳门票组合。
另外,我想有必要考虑这样一种情况,即购买一张比我实际需要的天数更多的定期票对我来说会是一个更好、更便宜的结果,但根据我乘坐的次数而定更便宜每天都去...
更新(基于 Petr 的建议..)
<?php
$tickets = array(
array("price"=>5, "label"=>"single", "period"=>null),
array("price"=>10, "label"=>"1 day", "period"=>1),
array("price"=>30, "label"=>"3 days", "period"=>3),
array("price"=>45, "label"=>"7 days", "period"=>7)
);
$trips = 2;
$startDate = new DateTime("2015-06-23");
$endDate = new DateTime("2015-06-30");
$endDate->modify("+1 day");
$interval = DateInterval::createFromDateString('1 day');
$period = new DatePeriod($startDate, $interval, $endDate);
$cost = array();
$day = 1;
foreach( $period as $date ){
$span = $startDate->diff($date);
$days = ( $span->format('%a') + 1 );
$ticket = getCheapestTicket( $days );
$cost[ $day ] = $ticket;
$day++;
}
function getCheapestTicket( $days ){
global $tickets, $trips;
$lowestSum = null;
$cheapestTicket = null;
echo "-- getCheapestTicket --" . PHP_EOL;
echo "DAYS TO COVER: " . $days . " / TRIPS: " . $trips . PHP_EOL;
foreach( $tickets as $ticket ){
$price = $ticket['price'];
$period = $ticket['period'] ? $ticket['period'] : -1;
if( $ticket['period'] ){
$units = ceil( $days / $period );
$sum = round( $units * $price );
}else{
$units = ceil( $days * $trips );
$sum = round( ( $days * $price ) * $trips );
}
if( $sum <= $lowestSum || !$lowestSum ){
if( $ticket['period'] > $cheapestTicket['period'] ){
$cheapestTicket = $ticket;
$lowestSum = $sum;
}else{
$lowestSum = $sum;
$cheapestTicket = $ticket;
}
}
echo "TICKET: " . $ticket['label'] . " / Units to cover days: " . $units . " / Sum: " . $sum . " / Period: " . $period . PHP_EOL;
}
echo "CHEAPEST TICKET: " . $cheapestTicket['label'] .
" / PRICE PER UNIT: " . $cheapestTicket['price'] . " / SUM: " . $lowestSum . PHP_EOL. PHP_EOL;
return $cheapestTicket;
}
我不确定这是否还在路上:)
【问题讨论】:
-
请为您的问题提供示例输入和输出。您还应该阅读一些有关动态编程的内容 - 闻起来像是一个非常适合它的问题(尽管我不是 100% 确定,因为我没有完全理解这个问题)
标签: algorithm linear-programming