太多发票了,直接遍历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.66
items=[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=0
n=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 = items
items= 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)