找出列表中的哪个数字加起来是某个数字,但有负数和小数

2024-05-29 11:04:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的数字,包括负数,第二位的小数。例如,(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))

here's the output


Tags: in列表forif数字resultfind小数
1条回答
网友
1楼 · 发布于 2024-05-29 11:04:46

获取列表的所有子集,检查每个子集的总和,当该总和最终与目标值匹配时,返回该子集

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的简单数组,它由布尔值组成;源数组中的每个值对应一个布尔值。每个布尔值表示源数组中对应值的包含/排除选项。数组开始时只有0,表示为每个项选择“排除”。然后使用名为inc_bool_array的函数将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, ... ]
.
.
.

逐渐地01的每一种可能的组合都会发生。然后pick用于生成仅包含与1相对应的值的子集,只需使用带有if条件的生成器即可:

subset = [ arr[ind] for ind in range(len(arr)) if pick[ind] == 1 ]

相关问题 更多 >

    热门问题