簡體   English   中英

查找列表中的哪個數字總和等於某個數字但帶有負數和小數

[英]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))

這是 output

獲取列表的所有子集,檢查每個子集的總和,當總和最終與目標值匹配時,返回該子集!

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM