【发布时间】:2013-12-27 07:14:50
【问题描述】:
在this 问题中,我们必须找到所需的单人票和家庭票数量,以使价格最低。如果许多安排的价格相同,则以最少门票打印安排。
问题陈述 Acmestan 的电影院有两种类型的门票:单人票仅适用于一个人,而家庭票则允许父母和他们的孩子进入电影院。不用说,家庭票的价格总是高于单程票,有时甚至高达单程票的五倍。
对于家庭来说,决定购买哪种机票安排最经济是相当具有挑战性的。例如,右图中描绘的家庭有四种门票安排可供选择: 七张单人票;两张家庭票;一张家庭票(亚当、鲍勃、辛迪),其余四张单人票;或者,一张家庭票(鲍勃和他的四个孩子)加上剩下两个的单人票。
编写一个程序来确定哪种票安排的价格最低。如果有多个这样的安排,请打印票数最少的安排。
我的DP方法如下:-
制作家谱。
每个节点都应该有字段 min_tickets(即最低门票数量)和 min_price(即最低价格)。这些字段表示将该人和他的孩子带出去所需的最低金额。此外,还有一些字段表示过程中涉及的家庭票数(fam_tickets)和单票数(sin_tickets)。
从叶节点开始。初始化
min_tickets=1和min_price= S(即单票价格)、fam_tickets=0、sin_tickets= 1。-
现在对于其他节点考虑他的子孙。 F 是家庭票的价格。对他们来说:-
min_price= min(F + min_price 所有孙子的总和 , S + 所有孩子的 min_price 的总和)
如果孙子为 NULL,我们采用
min_price=0 and min_tickets=0 为了找出 min_tickets,我们从给出最低价格的形式中推导出它。如果两种形态都降到相同的价格,我们会这样做:-
if(1+ min_tickets of all grandchildren summed > 1+ min_tickets of all children summed) min_tickets = 1+ min_tickets of all children summed; fam_tickets= fam_tickets of all children summed; sin_tickets= 1+ sin_tickets of all children summed; else min_tickets = 1+ min_tickets of all grandchildren summed; fam_tickets= 1+ fam_tickets of all grandchildren summed; sin_tickets= sin_tickets of all grandchildren summed;
这个解决方案正确吗?提前致谢。
【问题讨论】:
-
看起来很复杂(这是一个不好的迹象),这个问题看起来非常类似于最小顶点覆盖问题。但我认为DP是一个正确的选择。
-
我认为您的解决方案是正确的。您是否面临任何具体问题?
-
@AbhishekBansal...没有..只是想检查一下
-
@avinash 我认为 SPOJ 在线评委比我们更有资格检查您的方法。
-
@AbhishekBansal....问题下方的 cmets 提到了输入格式/文件中的一些问题...所以我想检查问题是否出在我的方法中
标签: algorithm dynamic-programming