發票問題

太多發票了,直接遍歷2^n複雜度,算不出,後來用貪心算法,排序後再選擇逼近。


#!/usr/bin/env python# -*- coding: utf-8 -*-# __author__ = 'James'def PowerSetsBinary(items):    N = len(items)    for i in range(2 ** N):#子集的個數        combo = []        for j in range(N):#用來判斷二進制數的下標爲j的位置的數是否爲1            if (i >> j) % 2:                combo.append(items[j])        if(abs(sum(combo)-2661.66)< 0.2):            print(combo)# items=[120, 168.49, 532]target = 2661.66items=[120, 168.49, 532, 14.56, 29.83, 2.82, 42.53, 288.80, 60.30, 57.68,       122.67, 59.40, 30.04, 0.98, 28.80, 3.33, 296.80, 9.05, 81.62,       37.04, 141.63, 61.38, 2.00, 1.04, 29.76, 3.01, 37.28, 60.10, 15.96,       2.63, 2.37, 23.07, 60.19, 40.59, 21.78, 1.74, 41.25, 24.30, 143.69,       22.68, 15.36, 14.40, 133.20, 0.76, 82.94, 11.54, 4.81, 29.06, 5.27]#PowerSetsBinary(items)bestsum=0n=len(items)def dfs(i, s):    global bestsum, n    if(i==n):        bestsum=s        return    if( s+items[i]<=target and (s+sum(items[i:]))>=target):        dfs(i+1, s+items[i])    if((s+sum(items[i+1:]))>=target):        dfs(i+1, s)dfs(0, 0)print("testsum %d" % bestsum)backup = itemsitems= sorted(backup, reverse=True)print(sum(items))print(items)def tanxin():    global bestsum    temp=[]    for i in items:        if (bestsum + i) <=target:            bestsum+=i            temp.append(i)    print(temp)    print(backup)    for j, val in enumerate(backup):        for i in temp:            if(i==val):                print(i)tanxin()print(bestsum)
相關文章
相關標籤/搜索