JiaoShou在爱琳大陆的旅行完毕,即将回家,为了纪念这次旅行,他决定带回一些礼物给好朋友。
在走出了怪物森林以后,JiaoShou看到了排成一排的N个石子。
这些石子很漂亮,JiaoShou决定以此为礼物。
但是这N个石子被施加了一种特殊的魔法。
如果要取走石子,必须按照以下的规则去取。
每次必须取连续的2*K个石子,并且满足前K个石子的重量和小于等于S,后K个石子的重量和小于等于S。
由于时间紧迫,Jiaoshou只能取一次。
现在JiaoShou找到了聪明的你,问他最多可以带走多少个石子
#这道题用Python咋解决?第一次接触贪心算法QAQ
这个贪心算法 还好搞, 要先提供一组测试数据 , N 个列表, S 参数
K 从 1 开始, 一致遍历到 K = N/4 或者 前K或后K的石子重量大于S了 ,
内层遍历 , 就是在 [K+1 , N-K] 范围内找 看那个2K的和最大。
再次研究了一下, 貌似不需要贪心算法呀。 暴力遍历就可以啦。
代码供参考
def get_stone(lst):
ret_sum = [0,0]
ret_K = 1
ret_Ki = 1
for K in range(1,N):
if len(lst[K:2*K])<K:
# 到列表底了,结束遍历
break
# print('Trace ', K)
for ki in range(0,N):
lst1 = lst[0+ki:0+ki+K]
lst2 = lst[0+ki+K:0+ki+2 * K]
if len(lst1)== K and len(lst2) == K:
sum1 = sum(lst1)
sum2 = sum(lst2)
if sum1>S or sum2>S:
break
else:
# print("\t", ki, lst1, lst2, sum1, sum2)
ret_sum = [sum1,sum2]
ret_K = K
ret_Ki = ki+1
else:
# 到列表底了,结束遍历
break
return [ret_K,ret_Ki,sum(ret_sum),ret_sum]
N=8
S=3
lst = [1 for n in range(N)]
ret_K,ret_Ki,ret_sum,ret_list = get_stone(lst)
print("结果")
print("列表", lst, "S={}".format(S))
print("K={},从{}开始采集,共采集重量{}。".format(ret_K,ret_Ki,ret_sum),"前K,后K合计",ret_list)
N=12
S=18
lst = [n for n in range(1,N+1)]
ret_K,ret_Ki,ret_sum,ret_list = get_stone(lst)
print("结果")
print("列表", lst, "S={}".format(S))
print("K={},从{}开始采集,共采集重量{}。".format(ret_K,ret_Ki,ret_sum),"前K,后K合计",ret_list)