找回密码
 加入
搜索
查看: 14482|回复: 33

[效率算法] 每日一题:[题目]有足够量的2分、5分、1分硬币,请问凑齐1元钱有多少种方法?

 火... [复制链接]
发表于 2013-1-19 10:08:52 | 显示全部楼层 |阅读模式
[题目]有足够量的1分、2分、5分硬币,请问凑齐1元钱有多少种方法?
下面隐藏的是我写了个,周末闲着没有事,玩玩,大家也乐乐。
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 2金钱 +30 贡献 +2 收起 理由
MicroBlue + 10 大侠的思路非常清晰,支持。
annybaby + 20 + 2 支持大侠出题~~

查看全部评分

发表于 2013-1-19 10:48:21 | 显示全部楼层
本帖最后由 MicroBlue 于 2013-1-19 10:51 编辑

笨方法:
Local $intOne  = 1
Local $intTwo  = 2
Local $intFive = 5
Local $intSum  = 100


For $i = 0 To 100
        For $j = 0 To 50
                For $k = 0 To 20
                        If $intOne * $i + $intTwo *$j + $intFive * $k == $intSum Then
                                ConsoleWrite($intOne & "X" & $i & "+" & $intTwo & "X" & $j & " + "& $intFive  & "X" & $k & "== 100" & @CRLF)
                        EndIf
                Next
        Next
Next

评分

参与人数 1金钱 +50 收起 理由
happytc + 50 谢谢参与

查看全部评分

发表于 2013-1-19 10:51:49 | 显示全部楼层
本帖最后由 netegg 于 2013-1-19 12:54 编辑

回复 1# happytc
三种硬币是必须都要有吗?
Local $i = 0, $j = 0, $k = 0, $o =0
While $i <= 100
        Do
                For $k = 0 To (100-$i-(2*$j))/5
                        If $i + 2 * $j + 5 * $k = 100 Then 
                           ConsoleWrite($i & '个1分' & $j & '个2分' & $k & '个5分' & @CR)
                           $o+=1
                        else
                           $o+=1
                       endif
                Next
                $j += 1
        Until $j > (100-$i)/2
        $j = 0
        $k = 0
        $i += 1
WEnd
consolewrite('共计算'&$o&'次')

评分

参与人数 1金钱 +50 收起 理由
happytc + 50 嗯呀……,学习

查看全部评分

 楼主| 发表于 2013-1-19 10:54:38 | 显示全部楼层
回复 3# netegg


    看题意嘛,肯定不是必须了,只要凑足一元就可以了。如,100个1分硬币,就是一种方法
发表于 2013-1-19 11:02:38 | 显示全部楼层
本帖最后由 annybaby 于 2013-1-19 11:26 编辑

回复 1# happytc

木有想到好办法:
For $i=0 To 20
        For $j= 0 To 50
                For $k= 0 To 100
                        If ($k+$j*2+$i*5)=100 Then ConsoleWrite($k&'个1分+'&$j&'个2分+'&$i&'个5分=1元'&@LF)
                Next
        Next
Next



====================删除了结果,看得累~

评分

参与人数 1金钱 +50 收起 理由
happytc + 50 呵,代码很短,结果很长

查看全部评分

发表于 2013-1-19 11:22:15 | 显示全部楼层
回复 2# MicroBlue

汗!!
坛子时间显示好像又有些问题了,我刚刚回复时看到只有你一个回复,而且不是这样的,我马上也贴了个,再看,你的已经是N久前修改了的~

PS:循环大的,放在越里面越好~~
 楼主| 发表于 2013-1-19 11:24:30 | 显示全部楼层
没有人来发个递归的?
发表于 2013-1-19 11:38:21 | 显示全部楼层
回复 6# annybaby


    谢谢提醒!!
发表于 2013-1-19 12:57:47 | 显示全部楼层
本帖最后由 netegg 于 2013-1-19 12:59 编辑

回复 5# annybaby

108171次?是指定终值的5倍,递归的还没整出来,上面那个代码只用计算19006次
发表于 2013-1-19 13:08:32 | 显示全部楼层
Dim $x, $y, $z
Dim $i = 0
For $x = 0 To 20
        For $y = 0 To 50
                For $z = 0 To 100
                        If (5 * $x) + (2 * $y) + $z = 100 Then
                                $i += 1
                                ConsoleWrite("$x:" & $x & @TAB & " $y:" & $y & @TAB & " $z:" & $z & ";" & @TAB & $i & @CR)
                        EndIf
                Next
        Next
Next

评分

参与人数 1贡献 +2 收起 理由
happytc + 2 发哥的,要支持,要学习!

查看全部评分

发表于 2013-1-19 13:26:14 | 显示全部楼层
本帖最后由 netegg 于 2013-1-19 14:06 编辑

[au3]
For $i = 0 To 20
        For $j = 0 To Int((100 - $i * 5) / 2)
                ConsoleWrite($i & '个5分+' & $j & '个2分+' & 100 - $i * 5 - $j * 2 & '个1分' & @LF)
        Next
next
[/au3]
只循环541次
 楼主| 发表于 2013-1-19 13:27:36 | 显示全部楼层
回复  MicroBlue

汗!!
坛子时间显示好像又有些问题了,我刚刚回复时看到只有你一个回复,而且不是这样的 ...
PS:循环大的,放在越里面越好~~
annybaby 发表于 2013-1-19 11:22


"PS:循环大的,放在越里面越好~~" --- 这个可说不定,一般只能这样说:尽量保证访问的数据具有连续性,避免跳跃。并不能说循环大的在内层就效率高。
如你的代码,跟下面的比较,并不能得出:循环大的,放在越里面越好


$hTime = TimerInit()
For $i = 0 To 100
        For $j = 0 To 50
                For $k = 0 To 20
                        If ($i + $j * 2 + $k * 5) = 100 Then ConsoleWrite($i & '个1分+' & $j & '个2分+' & $k & '个5分=1元' & @LF)
                Next
        Next
Next
$iTime = TimerDiff($hTime)
MsgBox(0, 0, $iTime)
发表于 2013-1-19 13:47:09 | 显示全部楼层
[au3]$hTime = TimerInit()
$i = 0
$o = 0
While $i <= 20
        For $j = 0 To Int((100 - $i * 5) / 2)
                ConsoleWrite($i & '个5分+' & $j & '个2分+' & 100 - $i * 5 - $j * 2 & '个1分' & @LF)
        Next
        $i += 1
WEnd
$iTime = TimerDiff($hTime)
$hTime = TimerInit()
For $i = 0 To 100
        For $j = 0 To 50
                For $k = 0 To 20
                        If ($i + $j * 2 + $k * 5) = 100 Then ConsoleWrite($i & '个1分+' & $j & '个2分+' & $k & '个5分=1元' & @LF)
                Next
        Next
Next
$iTime &= @CRLF & TimerDiff($hTime)
MsgBox(0, 0, $iTime)

[/au3]
发表于 2013-1-19 13:54:35 | 显示全部楼层
就算最不济也比那么循环快
[au3]$hTime = TimerInit()
For $i = 0 To 100
For $j = 0 To 100 step 2
For $k = 0 To 100 step 5
        If $i +$j+$j = 100 Then ConsoleWrite($i & '+' & $j/2 & '+'&$k/5)
Next
Next
next
$iTime = TimerDiff($hTime)
MsgBox(0, 0, $iTime)
[/au3]
发表于 2013-1-19 14:04:47 | 显示全部楼层
本帖最后由 annybaby 于 2013-1-19 14:35 编辑

回复 12# happytc

当然是针对这两种循环的放法,毫无疑问是大的放在里面更快些,不一定每说一句话都必须具有普遍性嘛

不能得出这个结论只是因为计时精度问题而已~~
比如说:
$hTime = TimerInit()
For $i=1 To 10000
        $m=1
Next
$iTime = TimerDiff($hTime)
MsgBox(0, 0, $iTime)


$hTime = TimerInit()
For $i=1 To 10001
        $m=1
Next
$iTime = TimerDiff($hTime)
MsgBox(0, 0, $iTime)


上面的循环会比下面的快一点(因为少算了一次),但是计时反映出来的结果也无法证明这一点

********************这样估计就看得出来了************
$hTime1 = TimerInit()
For $i=1 To 1000000
        For $j=1 To 10
                $s=1
        Next
Next
$iTime1 = TimerDiff($hTime1)
$hTime2 = TimerInit()
For $i=1 To 10
        For $j=1 To 1000000
                $s=1
        Next
Next
$iTime2 = TimerDiff($hTime2)
MsgBox(0, 0, $iTime1&@LF&$iTime2)


两者都是进行1千万次赋值操作,效率相差20%!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 00:39 , Processed in 0.145234 second(s), 31 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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