设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 5947|回复: 11
打印 上一主题 下一主题

编程题目(空瓶分酒)

[复制链接]
跳转到指定楼层
1#
发表于 2005-11-3 18:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、某人有12品脱啤酒一瓶(品脱是英容量单位,1品脱=0.568升),想从中倒出6品脱。但是他没有6品脱的容器,只有一个8品脱的容器和一个5品脱的容器。怎样的倒法才能使8品脱的容器中恰好装好了6品脱啤酒?

一种解法:

12 8 5

12 0 0

4 8 0

4 3 5

9 3 0

9 0 3

1 8 3

1 6 5

6 6 0



2、一个桶装满10斤油,另外有一个能装3斤油的空桶和一个能装7斤油的空桶。试用这三个桶把10斤油平分为两份。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2005-11-4 03:41:00 | 只看该作者
第1个

Public Function fj()

Dim intGet(1, 2) As Integer, i As Integer, j As Integer, tmp As Integer

intGet(0, 0) = 12: intGet(1, 0) = 12

intGet(0, 1) = 8: intGet(1, 1) = 0

intGet(0, 2) = 5: intGet(1, 2) = 0

Debug.Print intGet(1, 0) & "," & intGet(1, 1) & "," & intGet(1, 2)

Do Until intGet(1, 1) = 6

   For i = 0 To 2

      If intGet(1, (i + 1) Mod 3) = 0 Then j = i: Exit For

   Next

   i = j

   j = (i + 1) Mod 3

   tmp = intGet(1, i) + intGet(1, j)

   intGet(1, j) = IIf(intGet(0, j) < tmp, intGet(0, j), tmp)

   intGet(1, i) = IIf(intGet(0, j) < tmp, tmp - intGet(0, j), 0)

   Debug.Print intGet(1, 0) & "," & intGet(1, 1) & "," & intGet(1, 2)

Loop

End Function

[此贴子已经被作者于2005-11-4 9:16:03编辑过]

3#
发表于 2005-11-4 03:46:00 | 只看该作者
第二个的和第一个是一模一样的,就不写了

点击这里给我发消息

4#
发表于 2005-11-6 02:32:00 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
5#
发表于 2005-11-10 17:36:00 | 只看该作者
以下是引用海狸先生在2005-11-3 19:41:00的发言:



第1个

Public Function fj()

Dim intGet(1, 2) As Integer, i As Integer, j As Integer, tmp As Integer

intGet(0, 0) = 12: intGet(1, 0) = 12

intGet(0, 1) = 8: intGet(1, 1) = 0

intGet(0, 2) = 5: intGet(1, 2) = 0

Debug.Print intGet(1, 0) & "," & intGet(1, 1) & "," & intGet(1, 2)

Do Until intGet(1, 1) = 6

   For i = 0 To 2

      If intGet(1, (i + 1) Mod 3) = 0 Then j = i: Exit For

   Next

   i = j

   j = (i + 1) Mod 3

   tmp = intGet(1, i) + intGet(1, j)

   intGet(1, j) = IIf(intGet(0, j) < tmp, intGet(0, j), tmp)

   intGet(1, i) = IIf(intGet(0, j) < tmp, tmp - intGet(0, j), 0)

   Debug.Print intGet(1, 0) & "," & intGet(1, 1) & "," & intGet(1, 2)

Loop

End Function





方法很不错,如果能采用双向同时遍历,速度会更快。
6#
 楼主| 发表于 2005-11-11 20:18:00 | 只看该作者
Option ExplicitDim answ As String

Const a1 = 9999, b1 = 9, c1 = 7, d = 4Public Sub test()

answ = ""

Call fj

Debug.Print "The Best step is:" & answ

End SubPublic Function fj(Optional str As String, Optional a As Integer, Optional b As Integer, Optional c As Integer) As String

If a = 0 And b = 0 And c = 0 Then a = a1

If a = d Or b = d Or c = d Then

    If answ = "" Or Len(Mid(str, 2) & vbNewLine & a & " " & b & " " & c) < Len(answ) Then answ = Mid(str, 2) & vbNewLine & a & " " & b & " " & c

    'Debug.Print Mid(str, 2) & vbNewLine & a & " " & b & " " & c

Else

    If InStr(1, str, a & " " & b & " " & c) = 0 Then

        If a > 0 And b < b1 Then fj str & vbNewLine & a & " " & b & " " & c, IIf(a - b1 + b > 0, a - b1 + b, 0), IIf(a - b1 + b > 0, b1, a + b), c

        If b > 0 And a < a1 Then fj str & vbNewLine & a & " " & b & " " & c, IIf(a - a1 + b > 0, a1, a + b), IIf(a + b > a1, a - a1 + b, 0), c

        If a > 0 And c < c1 Then fj str & vbNewLine & a & " " & b & " " & c, IIf(a + c > c1, a - c1 + c, 0), b, IIf(a - c1 + c > 0, c1, a + c)

        If c > 0 And a < a1 Then fj str & vbNewLine & a & " " & b & " " & c, IIf(a - a1 + c > 0, a1, a + c), b, IIf(a + c > a1, a - a1 + c, 0)

        If b > 0 And c < c1 Then fj str & vbNewLine & a & " " & b & " " & c, a, IIf(b - c1 + c > 0, b - c1 + c, 0), IIf(b - c1 + c > 0, c1, b + c)

        If c > 0 And b < b1 Then fj str & vbNewLine & a & " " & b & " " & c, a, IIf(b - b1 + c > 0, b1, b + c), IIf(b - b1 + c > 0, b - b1 + c, 0)

    End If

End If

End Function‘以上的题目可以表述为:容积分别为a1,a2,a3的容器分别装有a,b,c数量的液体,只能通过互相倒满或者倒空一个容器,用最少步数得到指定的数量:d。’如果a1远大于b1和c1,则可以理解为a1是一个池塘或一个大酒缸。以上程序可以描述为:用9斤和7斤的量筒一次得到4斤的酒。
7#
发表于 2005-11-11 23:20:00 | 只看该作者
思路是a  b c d     a为需要分的容器,b和c是用来分的容器 ,b要大于c   ,d为指定数量先将 a 倒到b中,然后b到c中,c到a中,反复循环,直至条件满足,如果过程中出现有0,则从0的左边开始循环这个是最少的步骤
8#
发表于 2005-11-25 05:30:00 | 只看该作者
8错
9#
发表于 2005-12-20 06:40:00 | 只看该作者
顶啊,真是不错
10#
发表于 2006-3-11 06:32:00 | 只看该作者
[em02]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-9 04:21 , Processed in 0.085978 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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