发票问题

太多发票了,直接遍历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)

posted on 2019-10-15 17:18  katago  阅读(160)  评论(0编辑  收藏  举报