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

[效率算法] 考考你:百钱买百鸡

 火... [复制链接]
发表于 2010-12-15 20:45:24 | 显示全部楼层
今天才看, 只会一种笨方法!
Dim $a , $b, $c , $DATA, $TEMP = ""

For $a = 0 To 100/5
        For $b = 0 To Ceiling (100/3)
                For $c = 0 To 100*3
                        If $a*5 + $b*3 + $c/3 = 100 And $A + $B + $C = 100 Then
                                $DATA = $A & "   |  " & $B &  "  |  " & $C & @CRLF 
                                $TEMP &= $DATA
                        EndIf        
                        ;MsgBox(0,"OK", "公鸡:" & $a & @CRLF & "母鸡:" & $b & @CRLF & "小鸡:" & $c)
                Next        
        Next                        
Next
MsgBox(0,0,"公鸡   母鸡    小鸡 " & @CRLF & $TEMP)
发表于 2010-12-15 20:49:35 | 显示全部楼层
学习了,
发表于 2010-12-15 20:54:34 | 显示全部楼层
枚举法,看时间效率和复杂度
发表于 2010-12-15 21:02:32 | 显示全部楼层
本帖最后由 bob 于 2010-12-15 21:05 编辑


For $x=0 To 20
        For $y=0 To 33
                $z=100-$x-$y
                If 5*$x+3*$y+$z/3=100 And mod($z, 3) = 0 Then
                        MsgBox(0,"",$x & " " & $y & " " & $z)
                EndIf        
        Next        
Next
发表于 2010-12-16 15:51:30 | 显示全部楼层
学习学习,很好
发表于 2010-12-16 15:55:42 | 显示全部楼层
学 习 了 ....
发表于 2010-12-17 21:31:35 | 显示全部楼层
;11楼的都看到了,经典!按部就班改下(回头再看看,竟与31楼写到一块去)

$count = 0
For $i = 0 To 100 / 5 ;公鸡只 5文 ,100文 最多可以买 ( 100 /5 )
        For $j = 0 To 100 / 3 ;母鸡只 3文 ,100文 最多可以买 ( 100 /3 )
                For $k = 0 To 100 * 3 ;鸡仔只 3文 ,100文 最多可以买 ( 100 *3 )

                        If $i + $j + $k = 100 And $i * 5 + $j * 3 + $k / 3 = 100 Then ;当买 100只 并 总价 为 100文 时
                                
                                $count += 1

                                ConsoleWrite( @LF & @LF & _
                                                "购物清单: " & $count & @LF & _
                                                "公鸡: " & $i & " 只,价值:" & $i * 5 & " 文" & @LF & _
                                                "母鸡: " & $j & " 只,价值:" & $j * 3 & " 文" & @LF & _
                                                "鸡仔: " & $k & " 只,价值:" & $k / 3 & " 文" & @LF & _
                                                "总只数: " & $i + $j + $k & " 总价值:" & $i * 5 + $j * 3 + $k / 3 & " 文" & @LF & _
                                                "以上数据,仅供参考!"& @LF  & @LF _
                                                )

                        EndIf

                Next

        Next
Next

ConsoleWrite(@LF&@LF& "你将要采购的有 " & $count & " 种形式的配置!" &@LF&@LF)
发表于 2010-12-17 23:47:48 | 显示全部楼层
;Local $sy,$sy2

For $i = 1 To 100 ;以耗钱计算,什么都要买(鸡仔先算)
        $sy = 100 - $i
        
        For $j = 1 To $sy / 3
                
                $sy2 = $sy - $j * 3
                If Mod($sy2, 5) <> 0 Then ContinueLoop
                
                If  $sy2/5 + $j + $i*3 = 100 And $sy2/5<>0 Then ;计算是否为 100 只(并排除公鸡只数=0)
                        ConsoleWrite(@LF & "公鸡" & $sy2/5 & "母鸡" & $j & "鸡仔" & $i * 3 & @LF)
                EndIf
                
        Next
        
Next
发表于 2010-12-18 04:11:51 | 显示全部楼层
本帖最后由 _ddqs. 于 2010-12-18 14:13 编辑
;以耗钱计算,什么都要买(鸡仔先算)
;不付值变量进行交互,直接使用的后果……会连自己看了也会晕~~~
;并且做了重复运算,效率也差
;
;拿了 100 文去上街
For $i = 1 To 100 ;先买鸡仔
        
        If $i * 3 > 100 Then ExitLoop ;都限定 100 只鸡了,纵然全买小鸡也用不了 34 文
        
        For $j = 1 To (100 - $i) / 3 ;再买母鸡
                ;最后买公鸡
                If ((100 - $i) - $j * 3) / 5 + $j + $i * 3 = 100 And _ ;总数是不是 100 只
                                Mod((100 - $i) - $j * 3, 5) = 0 And _ ;余钱是不是可以全部买公鸡
                                ((100 - $i) - $j * 3) / 5 <> 0 _ ;排除公鸡数量为 0只
                                Then ;筛选数据,以上条件匹配时输出
                                
                        ConsoleWrite(@LF & "公鸡" & ((100 - $i) - $j * 3) / 5 & "母鸡" & $j & "鸡仔" & $i * 3 & @LF)
                        
                EndIf
                
        Next
        
Next
;以耗钱计算,什么都要买(鸡仔先算)
;不付值变量进行交互,直接使用的后果……会连自己看了也会晕~~~
;并且做了重复运算,效率也差
;买鸡顺序:小鸡——公鸡——母鸡,比,小鸡——母鸡——公鸡,循环次数较少!
;
;拿了 100 文去上街
For $i = 1 To 100 ;先买鸡仔($i文)
        
        If $i * 3 > 100 Then ExitLoop ;都限定 100 只鸡了,纵然全买小鸡也用不了 34 文
        
        For $j = 1 To (100 - $i) / 5 ;再买公鸡($j只)
                ;最后买母鸡(余钱)
                If ((100 - $i) - $j * 5) / 3 + $j + $i * 3 = 100 And _ ;总数是不是 100 只
                                Mod((100 - $i) - $j * 5, 3) = 0 And _ ;余钱是不是可以全部买母鸡
                                ((100 - $i) - $j * 5) / 3 <> 0 _ ;排除母鸡数量为 0只
                                Then ;筛选数据,以上条件匹配时输出
                                
                        ConsoleWrite(@LF & "公鸡" & $j & "母鸡" & ((100 - $i) - $j * 5) / 3 & "鸡仔" & $i * 3 & @LF)
                        
                EndIf
                
        Next
        
Next
发表于 2010-12-18 10:33:48 | 显示全部楼层
來學習一下。。
发表于 2010-12-18 14:52:33 | 显示全部楼层
本帖最后由 _ddqs. 于 2010-12-18 16:32 编辑
;多少钱可以买100只鸡
For $x = 1 To 100
        $ret = _buy($x)
        If $ret <> "" Then
                ConsoleWrite(@LF & @LF & "花了" & $x & "文可以买100只鸡" & @LF & "--------------------------" & @LF)
                ConsoleWrite($ret)
                ConsoleWrite("--------------------------" & @LF & @LF & @LF)
        EndIf
Next

Func _buy($money)

        Local $ret = ""

        For $i = 1 To $money / 3

                For $j = 1 To ($money - $i) / 5

                        If (($money - $i) - $j * 5) / 3 + $j + $i * 3 = 100 And _
                                        Mod(($money - $i) - $j * 5, 3) = 0 And _
                                        (($money - $i) - $j * 5) / 3 <> 0 _
                                        Then

                                $ret &= @LF & "公鸡" & $j & "母鸡" & (($money - $i) - $j * 5) / 3 & "鸡仔" & $i * 3 & @LF
                                $ret &= "公鸡" & $j*5 &" 文 "& "母鸡" & ((($money - $i) - $j * 5) / 3)*3 &" 文 "& "鸡仔" & $i * 3 / 3 &" 文 "& @LF
                                $ret &= "共" & ($j*5) + (((($money - $i) - $j * 5) / 3)*3) + ($i * 3 / 3) &" 文 "& @LF
                                
                        EndIf

                Next

        Next

        Return $ret

EndFunc   ;==>_buy
;多少钱可以买100只鸡
For $x = 1 To 100
        $ret = _buy($x)
        If $ret <> "" Then
                ConsoleWrite(@LF & @LF & "花了" & $x & "文可以买100只鸡" & @LF & "--------------------------" & @LF)
                ConsoleWrite($ret)
                ConsoleWrite("--------------------------" & @LF & @LF & @LF)
        EndIf
Next

Func _buy($money)

        Local $ret = ""

        For $i = 1 To $money / 3 ;女士优先(虽然与BB的循环次数一样,但可最大限度的降低内循环的值,使循环次数更少,并取得的数据会更多)

                For $j = 1 To ($money - $i * 3) / 5 ;男士追上
                        ;最后才有BB
                        If (($money - $i * 3) - ($j * 5)) <> 0 And $j + $i + (($money - ($i * 3) - ($j * 5)) * 3) = 100 Then ;计算余额非 0 并 总只数为 100.

                                $ret &= @LF & "公鸡" & $j & "只,母鸡" & $i & "只,鸡仔" & (($money - $i * 3) - ($j * 5)) * 3 &"只"& @LF
                                $ret &= "公鸡" & $j * 5 & "文," & "母鸡" & $i * 3 & "文," & "鸡仔" & (($money - $i * 3) - ($j * 5)) & "文" & @LF
                                $ret &= "共" & ($j * 5) + ($i * 3) + (($money - $i * 3) - ($j * 5)) & "文("& $j + $i + (($money - ($i * 3) - ($j * 5)) * 3) &"只)"& @LF

                        EndIf

                Next

        Next

        Return $ret

EndFunc   ;==>_buy
发表于 2010-12-18 15:00:26 | 显示全部楼层
本帖最后由 _ddqs. 于 2010-12-18 16:38 编辑

原来上街也有钱赚

--------------------------
公鸡1只,母鸡3只,鸡仔96只
公鸡5文,母鸡9文,鸡仔32文
共46文(100只)
--------------------------

花了46文可以买100只鸡
...
每条多2文
...
--------------------------

花了84文可以买100只鸡
--------------------------

花了86文可以买100只鸡
--------------------------

花了88文可以买100只鸡
--------------------------

花了90文可以买100只鸡
--------------------------

花了92文可以买100只鸡
--------------------------

花了94文可以买100只鸡
--------------------------

花了96文可以买100只鸡
--------------------------

花了98文可以买100只鸡
--------------------------

花了100文可以买100只鸡
--------------------------
发表于 2010-12-19 01:46:14 | 显示全部楼层
look a look
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-15 18:01 , Processed in 0.073249 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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