我有这些变量,也许可以达到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个变量并且需要查找结果,那有可能吗? 我阅读了一些随机链接,但从未见过这样的事情。
答案 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,但是除非目标值很小,否则您将无可救药,这样您就会获得很多早期回报。
该问题要求打印总和中的值的索引,而不是值本身。只需对代码进行少量修改即可完成(任何有兴趣的人都可以做练习!)。