题解 | #自动售货系统#
自动售货系统
http://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf
class Machine(object): def __init__(self, arr): self.products = arr[0] self.changes = arr[1] self.price = [2,3,4,5,8,6] self.balance = 0 print("S001:Initialization is successful") def insertMoney(self, coin): if coin not in [1,2,5,10]: print("E002:Denomination error") return if coin in [5, 10]: if self.changes[0] + self.changes[1]*2 < coin: print("E003:Change is not enough, pay fail") return if sum(self.products) == 0: print("E005:All the goods sold out") return h = {1:0, 2:1, 5:2, 10:3} self.changes[h[coin]] += 1 self.balance += coin print("S002:Pay success,balance={}".format(self.balance)) return def buy(self, item): h = {'A1':0, 'A2':1, 'A3':2, 'A4':3, 'A5':4, 'A6':5} if item not in h: print("E006:Goods does not exist") return if self.products[h[item]] == 0: print("E007:The goods sold out") return if self.price[h[item]] > self.balance: print("E008:Lack of balance") return self.products[h[item]] -= 1 self.balance -= self.price[h[item]] print("S003:Buy success,balance={}".format(self.balance)) return def popChange(self): if self.balance == 0: print("E009:Work failure") return self._combination() return def _combination(self): val = [1,2,5,10] f = [[None] * 4 for y in range(self.balance+1)] for i in range(self.balance+1): if i == 0: for j in range(4): f[i][j] = 0 continue for j in range(len(val)): if i >= val[j]: if f[i-val[j]][j] + 1 <= self.changes[j]: if f[i-val[j]][0] is not None: prev = sum(f[i-val[j]]) else: continue if f[i][0] is None: for k in range(4): f[i][k] = f[i-val[j]][k] f[i][j] += 1 else: if sum(f[i]) > prev+1: for k in range(4): f[i][k] = f[i-val[j]][k] f[i][j] += 1 for i in range(len(f)-1, -1, -1): if f[i][0] is not None: for j in range(4): print("{} yuan coin number={}".format(val[j], f[i][j])) self.changes[j] -= f[i][j] break self.balance = 0 return def queryItem(self): name = ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] arr = [list(x) for x in zip(name, self.price, self.products)] arr.sort(key=lambda x: -x[2]) for ele in arr: print(" ".join([str(x) for x in ele])) return def queryChange(self): val = [1,2,5,10] for i in range(len(self.changes)): print("{} yuan coin number={}".format(val[i], self.changes[i])) return def vendingMachineOperation(jobs): for job in jobs: if job[0] == 'r': M = Machine([list(map(int, ele.split('-'))) for ele in job[1:]]) elif job[0] == 'p': M.insertMoney(int(job[-1])) elif job[0] == 'b': M.buy(job[-1]) elif job[0] == 'c': M.popChange() elif job[0] == 'q': if job[1] == 0: M.queryItem() elif job[1] == 1: M.queryChange() else: print("E010:Parameter error") else: print("E010:Parameter error") return while True: try: jobs = list(input().split(';'))[:-1] jobs = [list(x.split()) for x in jobs] vendingMachineOperation(jobs) except: break