测试输入包含若干测试用例。每个测试用例的第1行包含两个正数 Q 和 N,其中 Q 是给定的报销额度,N(N<=30)是发票张数。随后是 N 行输入,每行的格式为: m Type_1:price_1 Type_2:price_2 ... Type_m:price_m 其中正整数 m 是这张发票上所开物品的件数,Type_i 和 price_i 是第 i 项物品的种类和价值。物品种类用一个大写英文字母表示。当N为0时,全部输入结束,相应的结果不要输出。
对每个测试用例输出1行,即可以报销的最大数额,精确到小数点后2位。
200.00 3 2 A:23.50 B:100.00 1 C:650.00 3 A:59.99 A:120.00 X:10.00 1200.00 2 2 B:600.00 A:400.00 1 C:200.50 1200.50 3 2 B:600.00 A:400.00 1 C:200.50 1 A:100.00 100.00 0
123.50 1000.00 1200.50
def cost_by_idx(invoice_list, max_cost, base_idx):
res = 0.0
for i in range(base_idx, len(invoice_list)):
if res + invoice_list[i] <= max_cost:
res += invoice_list[i]
return res
while True:
try:
in_list = input().split()
max_cost = float(in_list[0])
invoice_num = int(in_list[-1])
# 发票数 == 0,结束程序
if invoice_num == 0:
break
invoice_list = [] # 保存各发票可以报销的额度
for i in range(invoice_num):
invoice_data = input().split()[1:]
allowed_costs = []
for item in invoice_data:
cate, cost = item.split(':')
# 如果此发票包含不可报销类型,则跳过此发票
if cate not in ['A', 'B', 'C']&nbs***bsp;float(cost) > 600:
break
allowed_costs.append(float(cost))
else:
# 添加单张发票可以报销的总额
if sum(allowed_costs) <= 1000:
invoice_list.append(sum(allowed_costs))
invoice_list.sort(reverse=True)
res = 0.0
for i in range(len(invoice_list)):
res = max(res, cost_by_idx(invoice_list, max_cost, i))
print('{:.2f}'.format(res))
except Exception:
break