以下是来自CodeForces#381(第2部分)(link)的Alyona和Copybooks的问题陈述。
小女孩Alyona正在一家商店买一些学校用的抄写本。她 研究四个科目,所以她想要有相同数量的抄写本 每个科目。中有三种类型的字帖包 商店:可以买一张卢布的字帖,一包两张 b卢布的抄写本和一包三本c卢布的抄写本。 Alyona已经有了n本抄写本。
购买此类号码应支付的最低卢布金额是多少 副本书k,n + k可被4整除?有无数的 商店里的任何类型的包。 Alyona可以购买不同类型的包装 在同一次购买中。
输入唯一的行包含4个整数n,a,b,c (1≤N,A,B,C≤109)。
输出打印购买此类产品应支付的最低卢布金额 n + k的副本k的数量可以被4整除。
我最初试图通过探索如何使数量可被4整除的所有可能性来解决它。让f(n)为min。购买x教科书的成本使得(n + x)%4 = 0.然后,f(n)=min(f(n+1)+a, f(n+2)+b, f(n+3)+c)
。完整代码如下:
import sys
INF = sys.maxsize
def solution(n, prices):
if n % 4 == 0:
return 0
else:
ans = INF
ans = min(solution(n + 1, prices) + prices[A],
solution(n + 2, prices) + prices[B],
solution(n + 3, prices) + prices[C])
return ans
但是,它没有通过所有测试用例。我不知道为什么。这种方法有什么问题?
答案 0 :(得分:1)
您的递归解决方案实际上是一个3-way
递归树。
调用solution(3)
时,每一步的调用堆栈都是:
[sol(4),sol(5),sol(6)]
- > [sol(5),sol(6)]
- > [sol(6),sol(7),sol(8),sol(6)]
- > [sol(7),sol(8),sol(9),sol(7),sol(8),sol(6)]
- > ........
这会产生内存问题,例如超出堆栈限制。请从这里删除递归。您可以将解决方案修改为:
def solution(n,prices):
if n%4==0:
return 0
rem = 4-(n%4)
if rem==1:
return min(prices[0],prices[1]+prices[2],3*prices[2])
elif rem==2:
return min(2*prices[0], prices[1], 2*prices[2])
else:
return min(3*prices[0],prices[0]+prices[1],prices[2])
希望它有所帮助!!!
编辑:我修改了你的递归解决方案以杀死无休止的递归。
import sys
INF = sys.maxsize
def solution(n, prices, k):
if k>10:
return INF
if n % 4 == 0:
return 0
else:
ans = min(solution(n + 1, prices,k+1) + prices[0],
solution(n + 2, prices,k+2) + prices[1],
solution(n + 3, prices,k+3) + prices[2])
return ans
def main():
n,a,b,c = map(int, raw_input().split())
prices = [a,b,c]
print solution(n,prices,0)
main()