重击从结果中获得多个数字

时间:2019-03-14 13:30:16

标签: bash shell random

我有这些变量,也许可以达到100(最少两个变量) (最高+50)

1=10
2=21
3=44
4=36
...

,需要找出哪些变量总计为57 在这种情况下,变量4 + 2。 也许结果是90,而这种情况是1 + 3 + 4。

我认为需要一些随机代码,也许像这样。

#!/bin/bash
array[0]=10
array[1]=21
array[2]=44
array[3]=36
Next add random until this fits to result 

但是,如果我有100个变量并且需要查找结果,那有可能吗? 我阅读了一些随机链接,但从未见过这样的事情。

1 个答案:

答案 0 :(得分:0)

此递归Bash函数尝试使用蛮力查找和打印总和,检查所有可能的总和,方法:

function print_sums
{
    local -r target=$1              # Number for which sums are to be found
    local -r pre_sum=$2             # Sum built up for an outer target
    local -r values=( "${@:3}" )    # Values available to use in sums

    if (( target == 0 )) ; then
        printf '%s\n' "$pre_sum"
    elif (( ${#values[*]} == 0 )) ; then
        :
    else
        # Print any sums that include the first in the list of values
        local first_value=${values[0]}
        if (( first_value <= target )) ; then
            local new_pre_sum
            [[ -z $pre_sum ]]   && new_pre_sum=$first_value \
                                || new_pre_sum="$pre_sum+$first_value"
            local new_target=$((target - first_value))
            print_sums "$new_target" "$new_pre_sum" "${values[@]:1}"
        fi

        # Print any sums that don't include the first in the list of values
        print_sums "$target" "$pre_sum" "${values[@]:1}"
    fi

    return 0
}

用法示例,其中包含用于求和的可能值的扩展列表:

values=(10 21 44 36 85 61 69 81 76 39 95 22 30 4 29 47 80 18 40 44 )
print_sums 90 '' "${values[@]}"

此打印:

10+21+30+29
10+44+36
10+36+22+4+18
10+36+4+40
10+36+44
10+76+4
10+22+18+40
10+4+29+47
10+80
21+36+4+29
21+69
21+39+30
21+22+29+18
21+22+47
21+4+47+18
21+29+40
61+29
39+22+29
39+4+29+18
39+4+47

在一台老式的Linux机器上花费不到一秒钟的时间。但是,指数爆炸(每个附加的值都会使尝试的总和数加倍)意味着对于大量的值来说,这不是一个可行的解决方案。我还没有尝试过50,但是除非目标值很小,否则您将无可救药,这样您就会获得很多早期回报。

该问题要求打印总和中的值的索引,而不是值本身。只需对代码进行少量修改即可完成(任何有兴趣的人都可以做练习!)。