硬币算法
‘壹’ 用1分,2分和5分硬币凑成一元钱的方法有多少种
不知道有没有限制一定要有这3种硬币呢?如果这三种硬币必须至少用一枚的话,算法如下:
设x个1分,y个2分,z个5分,且xyz都是正自然数
x+2y+5z=100
19>=z>=1
z=1时 x+2y=95 x>=1,且x是奇数;2y<=94,且y是整数,所以有47种
z=2时 x+2y=90 1<=y<=44 同理,有44种
z=3时 x+2y=85 1<=y<=42 同理,有42种
z=4时 x+2y=80 1<=y<=39 同理,有39种
z=5时 x+2y=75 1<=y<=37 同理,有37种
……
这个方法好笨,要算19次……不过我暂时想不出更好的方法
但有个规律就是个数依次-3,-2,-3,-2,-3……
‘贰’ vb编程一块钱换成1分,2分5分的硬币,总共60枚,有多少种算法
这个题可以有两种编程法,下面都介绍一下吧。先要在Form中放一个按钮和一个文本框,点击按钮后,运行结果以文本形式显示在文本框中。 方法一、用三重循环,分别用1分、2分、5分的硬币数去尝试组合,遍历所有组合,找出满足要求的组合,保存州空起来。这是比较笨的一种方法,程序运行效率很低。程序如下: Private Sub Command1_Click() Dim Cnt_1, Cnt_2, Cnt_5 As Integer ‘ 分别表示1分、2分和5分硬币的数量 Dim Cnt_All As Integer ' 用于统计满足要求的组合总数 Dim Result(60) As String ' 以文本形式保存的组合方案,分别列明组合中各硬币的数量。因为硬币总数是60枚,所以最多不会超过60种算法。 Cnt_All = 0 Text1.Text = "" For Cnt_1 = 0 To 60 ' 1分硬币最多只能有60枚,因为总数就是60枚 For Cnt_2 = 0 To 50 ' 2分硬币最多只能有50枚,1元只有100分 For Cnt_5 = 0 To 20 ' 5分硬币最多只能有20枚,1元只有100分 If Cnt_1 + 2 * Cnt_2 + 5 * Cnt_5 = 100 And Cnt_1 + Cnt_2 + Cnt_5 = 60 Then Result(Cnt_All) = "1分硬币" & Cnt_1 & "枚;2分硬币" & Cnt_2 & "枚;5分硬币" & Cnt_5 & "枚。" Text1.Text = Text1.Text & Result(Cnt_All) & vbCrLf Cnt_All = Cnt_All + 1 End If Next Cnt_5 Next Cnt_2 Next Cnt_1 Text1.Text = Text1.Text & vbcrlf & "总共有" & Cnt_All - 1 & "种组合算法。" End Sub 方法二、先分析问题,寻找简单算法:设需要1分、2分、5分的硬币数量分别为X、Y、Z,根据题目要求得到两个方程:X + Y + Z = 60,1*X + 2*Y + 5*Z = 100,解此三元方程组森喊得:Y = 40 - 4*Z,X = 20 + 3*Z。显然,X、Y、Z都不可能是负数,由Y=40-4*Z可知,Z的最大值就是10,即只需要循环11次即可找出全部算法。显然,这种方法程序简此迹野单、循环次数少,运行效率高、速度快。程序如下: Private Sub Command1_Click() Dim Cnt_5 As Integer ‘ 表示5分硬币的数量,对应方程中的Z Dim Cnt_All As Integer ' 用于统计满足要求的组合总数 Dim Result(11) As String ' 以文本形式保存的组合方案,分别列明组合中各硬币的数量。Z最大是10,可知算法只有11种。 Cnt_All = 0 Text1.Text = "" For Cnt_5 = 0 To 20 Cnt_1 = 20 + 3 * Cnt_5 Cnt_2 = 40 - 4 * Cnt_5 Result(Cnt_All) = "1分的硬币" & 20 + 3 * Cnt_5 & "枚;2分的硬币" & 40 - 4 * Cnt_5 & "枚; 5分的硬币" & Cnt_5 & "枚。" Text1.Text = Text1.Text & Result(Cnt_All) & vbCrLf Cnt_All = Cnt_All + 1 Next Cnt_5 Text1.Text = Text1.Text & vbcrlf & "总共有" & Cnt_All - 1 & "种组合算法。" End Sub
‘叁’ 从三个硬币ABC中取出两个来,可以有多少种方法
一手抓有AB,BC和CA三种。BA,CB和AC属于重复情况。算法是3X2/2=3. 一个一个取,有AB,BA,BC,CB,AC和CA六种。算法是3X2=6. 拿了还放回去有AA,BB,CC,AB,BA,BC,CB,AC和CA有九种。算法是3X3=9.