找回密码
 加入
搜索
楼主: afan

[效率算法] 从一组数字中任意组合N个数字,使之和在某个数值范围

 火... [复制链接]
发表于 2010-1-20 12:25:18 | 显示全部楼层
都是牛人 顶一下
发表于 2010-1-20 12:25:53 | 显示全部楼层
第一个计算耗时:333.820359850204 毫秒。
看来我的电脑老了点
发表于 2010-1-20 12:32:30 | 显示全部楼层
回复  sanmoking


    高手就是高手,学习了~!
afan 发表于 2010-1-20 12:24



    我是菜鸟啊,老大,可不是高手,接触au3之前什么都不懂的。。。。。正则都不会,dos也不会,api跟wmi都分不清。。。。
发表于 2010-1-20 12:38:26 | 显示全部楼层
我是菜鸟啊,老大,可不是高手,接触au3之前什么都不懂的。。。。。正则都不会,dos也不会,api跟 ...
sanmoking 发表于 2010-1-20 12:32


不管怎样,你的代码很干练的。
递归我也考虑,但想了半天无果
发表于 2010-1-20 12:40:57 | 显示全部楼层
啥叫递归?
发表于 2010-1-20 13:09:48 | 显示全部楼层
啥叫递归?
sanmoking 发表于 2010-1-20 12:40


函数自己调用自己
发表于 2010-1-20 13:26:13 | 显示全部楼层
看看高深的东西
发表于 2010-1-20 14:09:26 | 显示全部楼层
高手有高招,俺菜鸟自叹不如!
发表于 2010-1-20 15:50:11 | 显示全部楼层
我刚试了一下自己写一个,发现居然要NN秒...
发表于 2010-1-20 16:37:30 | 显示全部楼层
本帖最后由 supersp 于 2010-1-20 16:54 编辑

我这里跑起来71ms...应该还能更快一点
#Include <Array.au3>

$begin = TimerInit()
Dim $aArray[15] = [51, 8, 13, 2, 52, 61, 37, 85, 19, 11, 7, 62, 22, 38, 79]
_ArraySort($aArray)
Global $mArray[1],$oArray[1],$display[1]
$oArray[0]=0
For $v1 In $aArray
        Switch $v1
                Case 1 To 57
                        _ArrayAdd($mArray,$v1)
                Case 58 To 105
                        _ArrayAdd($oArray,$v1)
        EndSwitch
Next
_ArrayDelete($mArray, 0)
For $v2 = 0 To UBound($oArray)-1
        _xh($oArray[$v2],String($oArray[$v2]),UBound($mArray))
Next

Func _xh($var,$str,$n)
        For $i = $n To 0 Step -1
                $num = Execute("$var + $mArray[$i]")
                Switch $num
                        Case 105 To 1500
                                ContinueLoop
                        Case 102 To 105
                                _ArrayAdd($display,$str&"+"&String($mArray[$i])&"="&String($num))
                        Case 1 To 102
                                _xh($num,$str&"+"&String($mArray[$i]),$i-1)
                EndSwitch
        Next
EndFunc
_ArrayDelete($display, 0)
$dif = TimerDiff($begin)
_ArrayDisplay($display,"耗时:"&$dif)

评分

参与人数 1金钱 +70 贡献 +5 收起 理由
afan + 70 + 5 学习了

查看全部评分

发表于 2010-1-20 16:56:55 | 显示全部楼层
本帖最后由 supersp 于 2010-1-20 17:03 编辑

试了把 UBound($mArray) 单独提出来赋值,速度提高了3ms左右
编译exe后,运行..34ms..
=.=
来点分吧..
 楼主| 发表于 2010-1-20 17:30:04 | 显示全部楼层
回复 25# supersp


    很不错的,就是前面多了个0(15个数字中并未包含0),还有,之前可能没说清楚,数值范围应该是大于102,小于105,也就是103 or 104。
  效率的确高,感谢参与~!
发表于 2010-1-20 17:45:56 | 显示全部楼层
现在流行玩算法啊,呵呵
发表于 2010-1-20 17:46:03 | 显示全部楼层
有个0 是因为 我把 58-105之间的数字 x 提出来了, 因为 x 只会用到一次,用到2次就肯定超过105了,所以不用参与递归
这点提高不少效率,但是不用到 x ,只1-57 之间的数字 y自加也会有符合的值,所以我添加了一个0,表示 x 数组没有参与计算..
当然0在输出时,可以想办法去掉

还有排序数组后,当数字较小的都>105时,那么排在后面较大的数字就肯定不符合了
所以 _xh($num,$str&"+"&String($mArray[$i]),$i-1)   上标参数就是$i-1, 在下次循环时就剔除了当前数字,和排在这个数字后面的部分。
这也提高不少效率。

至于103.104 判断改下就可以了

评分

参与人数 1威望 +5 收起 理由
afan + 5

查看全部评分

 楼主| 发表于 2010-1-20 17:52:35 | 显示全部楼层
回复 29# supersp


    嗯,解释得很详细,学习~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-19 20:15 , Processed in 0.084114 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表