测试输入包含若干测试用例。每个测试用例的第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