gapkiller 发表于 2010-1-25 12:01:16

关于afan的"任意N个数字组合"问题,sanmoking的代码似乎有问题哦..

本帖最后由 gapkiller 于 2010-1-26 09:14 编辑

原帖:
http://www.autoitx.com/forum.php?mod=viewthread&tid=12470&extra=page%3D2

下面是sanmoking的算法.
数组后面加了个1, 结果就不对啦, 显然结果不全.
Dim $aArray =
;Dim $aArray =
GUICreate("",400,320)
GUICtrlCreateList("",10,10,380,300)

Global $Count=0
$begin = TimerInit()
$msg=""
mimi(0,0,"")
$dif = TimerDiff($begin)
GUICtrlSetData(-1, "共 "&$Count&" 种方式   耗时: "&$dif)

GUISetState()
While GUIGetMsg()+3
WEnd

Func mimi($k,$resd,$txtd)
        If $k < UBound($aArray) Then
                For $i = $k To UBound($aArray) - 1
                        $resx = $resd + $aArray[$i]
                        $txtx = $txtd & $aArray[$i] & "+"
                        If $resx <= 102 Then mimi($i+1,$resx,$txtx)
                        If $resx > 102 And $resx < 105 Then
                                GUICtrlSetData(-1, StringReplace($txtx & "=", "+=", "=") & $resx)
                                $Count += 1
                                       mimi($i+1,$resx,$txtx); 加上这句就对了...
                        EndIf
                        $resx = $resd
                Next
        EndIf
EndFunc

gapkiller 发表于 2010-1-25 12:01:53

不过如果先做一下arraysort($aArray)结果就对了

sanmoking 发表于 2010-1-25 16:02:14

我也不清楚是怎么回事。。。

sanmoking 发表于 2010-1-25 16:03:32

看了代码也没什么问题啊。。

sanmoking 发表于 2010-1-25 16:04:35

如果要先排序一下数组,可能就会扰乱结果的排序了。。

gapkiller 发表于 2010-1-25 16:18:01

因为程序里计算到 102<结果<105 就跳出来啦
其实应该接着循环,直到结果>=105

其实, 即使先排序, 有些情况也是不行滴

应该是算法有问题啦

sanmoking 发表于 2010-1-25 17:16:38

我发现问题了。改好再发。

sanmoking 发表于 2010-1-25 17:33:58

本帖最后由 sanmoking 于 2010-1-25 18:38 编辑

Dim $aArray =
GUICreate("", 400, 620)
GUICtrlCreateEdit("", 10, 10, 380, 600)

$coo = 0 ;存储计算次数
$com = 0
$begin = TimerInit();开始计时
mimi(0, 0, "")
$dif = TimerDiff($begin);结束记时



GUICtrlSetData(-1, "计算耗时: " & $dif&@CRLF,1)
GUICtrlSetData(-1, "总计计算了"&$coo&"次加法运算"&@CRLF,1)
GUICtrlSetData(-1, "正确结果有"&$com&"种算法"&@CRLF,1)
GUISetState()
While GUIGetMsg() + 3
WEnd

Func mimi($k, $resd, $txtd)
                For $i = $k To UBound($aArray) - 1
                        $resx = $resd + $aArray[$i]
                        $txtx = $txtd & $aArray[$i] & "+"
                        $coo += 1
                        If $resx <= 102 Then                                       
                              mimi($i + 1, $resx, $txtx)                        
                        ElseIf $resx > 102 And $resx < 106 Then
                              GUICtrlSetData(-1, StringReplace($txtx & "=", "+=", "=") & $resx&@CRLF,1)
                              $com += 1
;~ --------------------------------下边这句必须加上的-----------------------                              
                              mimi($i + 1, $resx, $txtx)      
;~ 之所以犯错,就是因为afan的题目直接是103,104两个结果,这两个相差为1,并且它提供的数组里面正好没有1,所以测试一下结果对上46就以为通过了      
;~ 不加上面这句,如果得到一个51+13+2+19+11+7=103的结果,1在7之前,可以把1算上,1在7之后,就不会去计算了
;~ 假如题目要求是100,110之间的结果,那么比如51+13+2+19+11+5+7=108这样的结果就不会得到,
;~ 只会得到51+13+2+19+11+5=101,符合结果范围,就不在去加后边的7了,因为7小于10
;~ 本代码上面的数组你把最后那个0去掉,就会发现结果是140个,因为添加了一个0,所以140个结果每个加上0,还是符合的,所以结果翻了一倍变成280个了.
                        EndIf
                Next
EndFunc   ;==>mimi

sanmoking 发表于 2010-1-25 17:37:41

本帖最后由 sanmoking 于 2010-1-25 18:39 编辑

51+8+13+2+19+11=104
51+8+13+2+19+11+1=105
51+8+13+2+7+22=103
51+8+13+2+7+22+1=104
51+8+13+19+11+1=103
51+8+13+11+22=105
51+8+2+37+7=105
51+8+2+19+22+1=103
51+8+37+7=103
51+8+37+7+1=104
51+8+7+38=104
51+8+7+38+1=105
51+13+2+37=103
51+13+2+37+1=104
51+13+2+19+11+7=103
51+13+2+19+11+7+1=104
51+13+2+38=104
51+13+2+38+1=105
51+13+19+22=105
51+13+11+7+22=104
51+13+11+7+22+1=105
51+13+38+1=103
51+2+52=105
51+2+19+11+22=105
51+2+11+38+1=103
51+52=103
51+52+1=104
51+19+11+22=103
51+19+11+22+1=104
8+13+2+52+19+11=105
8+13+2+52+7+22=104
8+13+2+52+7+22+1=105
8+13+2+61+19=103
8+13+2+61+19+1=104
8+13+2+61+11+7+1=103
8+13+2+37+7+38=105
8+13+2+19+62=104
8+13+2+19+62+1=105
8+13+2+19+22+38+1=103
8+13+2+11+7+62=103
8+13+2+11+7+62+1=104
8+13+2+79+1=103
8+13+52+19+11=103
8+13+52+19+11+1=104
8+13+52+7+22+1=103
8+13+61+22=104
8+13+61+22+1=105
8+13+37+7+38=103
8+13+37+7+38+1=104
8+13+19+62+1=103
8+13+62+22=105
8+2+52+19+22=103
8+2+52+19+22+1=104
8+2+52+11+7+22+1=103
8+2+61+11+22=104
8+2+61+11+22+1=105
8+2+37+19+38=104
8+2+37+19+38+1=105
8+2+37+11+7+38=103
8+2+37+11+7+38+1=104
8+2+85+7+1=103
8+2+19+11+62+1=103
8+2+11+62+22=105
8+52+37+7=104
8+52+37+7+1=105
8+52+7+38=105
8+61+11+22+1=103
8+37+19+11+7+22=104
8+37+19+11+7+22+1=105
8+37+19+38+1=103
8+37+22+38=105
8+85+11=104
8+85+11+1=105
8+19+11+7+22+38=105
8+11+7+79=105
8+11+62+22=103
8+11+62+22+1=104
13+2+52+37=104
13+2+52+37+1=105
13+2+52+19+11+7=104
13+2+52+19+11+7+1=105
13+2+52+38=105
13+2+61+19+7+1=103
13+2+61+7+22=105
13+2+37+19+11+22=104
13+2+37+19+11+22+1=105
13+2+19+11+22+38=105
13+2+19+7+62=103
13+2+19+7+62+1=104
13+2+11+79=105
13+52+37+1=103
13+52+19+11+7+1=103
13+52+11+7+22=105
13+52+38=103
13+52+38+1=104
13+61+19+11=104
13+61+19+11+1=105
13+61+7+22=103
13+61+7+22+1=104
13+37+19+11+22+1=103
13+85+7=105
13+19+11+62=105
13+19+11+22+38=103
13+19+11+22+38+1=104
13+11+79=103
13+11+79+1=104
13+7+62+22=104
13+7+62+22+1=105
2+52+37+11+1=103
2+52+19+7+22+1=103
2+52+11+38=103
2+52+11+38+1=104
2+61+19+22=104
2+61+19+22+1=105
2+61+11+7+22=103
2+61+11+7+22+1=104
2+37+19+7+38=103
2+37+19+7+38+1=104
2+85+11+7=105
2+19+62+22=105
2+11+7+62+22=104
2+11+7+62+22+1=105
2+62+38+1=103
2+22+79=103
2+22+79+1=104
52+19+11+22=104
52+19+11+22+1=105
61+37+7=105
61+19+22+1=103
37+19+11+38=105
37+7+22+38=104
37+7+22+38+1=105
85+19=104
85+19+1=105
85+11+7=103
85+11+7+1=104
19+7+79=105
19+62+22=103
19+62+22+1=104
11+7+62+22+1=103
计算耗时: 36.3465189011453
总计计算了3554次加法运算
正确结果有140种算法

gapkiller 发表于 2010-1-25 17:41:57

神速啊....崇拜ing

gapkiller 发表于 2010-1-25 18:02:49

可是我很负责地告诉你,还是不对哦....
不然你arraysort一下看看
结果不一样哦....

哎,sanmoking要疯了...

sanmoking 发表于 2010-1-25 18:40:07

哈哈,没疯,找到问题了.
If $resx < 102 Then
ElseIf $resx > 102 And $resx < 106 Then

应该是

If $resx <= 102 Then
ElseIf $resx > 102 And $resx < 106 Then

sanmoking 发表于 2010-1-25 18:41:37

你随便你arraysort一下吧,哈哈,赶紧加分
页: [1]
查看完整版本: 关于afan的"任意N个数字组合"问题,sanmoking的代码似乎有问题哦..