novoland
12/14/2015 - 3:10 PM

DP找最佳套票规则 & 最大优惠 ---- 这是个完全背包问题

DP找最佳套票规则 & 最大优惠 ---- 这是个完全背包问题

#!/usr/bin/python
# coding=utf-8


n = 10            # 有多少张票
a = [0] * (n+1)   # a[i]表示前i张票能获得的优惠最大值
applies = [[]] * (n+1)  # applies[i]:前i张票获得最大优惠时采用的所有套票规则
rules = [(2,10), (3,14), (4,22), (5,23)]    # 套票规则,买2优惠10 etc.

def test():
    for i in range(1,n+1):
        a[i] = a[i-1]   # 初始不用套票规则
        for j in range(len(rules)):
            ruleN, ruleV = rules[j]
            if i >= ruleN:
                old = a[i]
                a[i] = max(a[i-ruleN] + ruleV, old)
                # 记录应用的规则
                if old != a[i]:
                    applies[i] = applies[i-ruleN][:]
                    applies[i].append(rules[j])

if __name__ == "__main__":
    test()
    print a
    print applies
    #[0, 0, 10, 14, 22, 24, 32, 36, 44, 46, 54]
    #[[], [], [(2, 10)], [(3, 14)], [(4, 22)], [(3, 14), (2, 10)], [(4, 22), (2, 10)], [(4, 22), (3, 14)], [(4, 22), (4, 22)], [(4, 22), (3, 14), (2, 10)], [(4, 22), (4, 22), (2, 10)]]