繁体   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