[英]find which number in a list sum up to a certain number but with negative and decimals
我列出了一個很大的數字,其中包括負數、第二位十進制數。 例如, (10348.94, -984.23, 9429.92)
。 我想找到一個從列表中的一個加起來的數字的總和。 列表中的數字也可以重復,並且給定的總和可以是負數。
這是我到目前為止所得到的,重復和小數似乎有效,但是當我嘗試在列表和給定總和中都做一個負數時,它就不起作用了。
def Find(goal, VarienceNum):
variance = [[Listed] for Listed in VarienceNum]
newList = []
result = []
while variance:
for holder in variance:
s = sum(holder)
for Listed in VarienceNum:
if Listed >= holder[-1]:
if s + Listed < goal:
newList.append(holder + [Listed])
elif s + Listed == goal:
result.append(holder + [Listed])
variance = newList
newList = []
return result
goal=float(input("please enter your goal: "))
VarienceNum=list(map(float,input("please enter the list: ").split()))
print(Find(goal,VarienceNum))
獲取列表的所有子集,檢查每個子集的總和,當總和最終與目標值匹配時,返回該子集!
def inc_bool_array(arr, ind=0):
if (ind >= len(arr)): return;
if (arr[ind] == 0):
arr[ind] = 1;
else:
arr[ind] = 0;
inc_bool_array(arr, ind + 1);
def find_subset_sum(target, arr):
size = len(arr);
pick = [ 0 for n in arr ];
num_subsets = 2 ** size;
'''
Loop through every possible subset until we find one such that
`sum(subset) == target`
'''
for n in range(num_subsets):
''' Subset is determined by the current boolean values in `pick` '''
subset = [ arr[ind] for ind in range(size) if pick[ind] == 1 ];
if sum(subset) == target: return subset;
''' Update `pick` to the next set of booleans '''
inc_bool_array(pick);
return None;
print(find_subset_sum(3, [ 1, 2, 3 ]));
print(find_subset_sum(5, [ 1, 2, 3 ]));
print(find_subset_sum(6, [ 1, 2, 3 ]));
print(find_subset_sum(7, [ 1, 2, 3 ]));
print(find_subset_sum(3, [ -1, 5, 8 ]));
print(find_subset_sum(4, [ -1, 5, 8 ]));
print(find_subset_sum(5, [ -1, 5, 8 ]));
print(find_subset_sum(6, [ -1, 5, 8 ]));
print(find_subset_sum(7, [ -1, 5, 8 ]));
print(find_subset_sum(8, [ -1, 5, 8 ]));
print(find_subset_sum(12, [ -1, 5, 8 ]));
print(find_subset_sum(13, [ -1, 5, 8 ]));
這里的困難部分是獲取列表的所有可能子集。 獲取所有子集是為列表中的每個項目選擇“包含”或“排除”的問題(每個元素 2 個選項導致2^n
可能的選擇和2^n
可能的子集)。
為了枚舉所有這些選擇,我使用了一個名為pick
的簡單數組,它由 boolean 值組成; 源數組中的每個值都有一個 boolean 值。 每個 boolean 代表源數組中其對應值的包含/排除選項。 數組開始時只有0
,代表每個項目的“排除”選擇。 然后使用名為inc_bool_array
的 function 將pick
更新為下一組值。 這意味着 pick 將隨着時間的推移采用這些值:
Step 1: [ 0, 0, 0, 0, 0, ... ]
Step 2: [ 1, 0, 0, 0, 0, ... ]
Step 3: [ 0, 1, 0, 0, 0, ... ]
Step 4: [ 1, 1, 0, 0, 0, ... ]
Step 5: [ 0, 0, 1, 0, 0, ... ]
Step 6: [ 1, 0, 1, 0, 0, ... ]
Step 7: [ 0, 1, 1, 0, 0, ... ]
Step 8: [ 1, 1, 1, 0, 0, ... ]
Step 9: [ 0, 0, 0, 1, 0, ... ]
.
.
.
0
s 和1
s 的每一種可能的組合都會逐漸出現。 然后pick
用於生成僅包含對應於1
的值的子集,只需使用帶有if
條件的生成器:
subset = [ arr[ind] for ind in range(len(arr)) if pick[ind] == 1 ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.