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