甲、乙、丙、丁四人共有糖若干块,甲先拿出一些糖分给另外三人,使他们三人的糖数加倍;乙拿出一些糖分给另外三人,也使他们三人的糖数加倍;丙、丁也照此办理,此时甲、乙、丙、丁四人各有16块,编程求出四个人开始各有糖多少块。

解决方案 »

  1.   

    这个容易嘛
    就用a,b,c,d代表甲、乙、丙、丁各人的糖块,操作一次记录一次
    比如说甲分出去后则:a-b-c-d,2b,2c,2d
    后面的你自己想想吧
      

  2.   

    谢谢各位回复!首先,遇到一个问题最好你好好的想过最后能用程序实现,然后在对这个问题作出评论,特别是算法方面的! 
    to weaest
    这个题目的结果是不唯一的!
    to guao
    逆推第一步是很容易的,后面的你再试试。
      

  3.   

    Private Sub Command1_Click()
        Dim a(4) As Integer
        a(1) = 16
        a(2) = 16
        a(3) = 16
        a(4) = 16
        Dim i As Integer
        Dim j As Integer
        For i = 4 To 1 Step -1           '若需要增加分糖人数就自己改一下吧
            For j = 1 To 4
                If j <> i Then
                    a(i) = a(i) + a(j) / 2
                    a(j) = a(j) / 2
                End If
            Next
            Print a(i) / 2 ^ (i - 1)
        Next
    End Sub
      

  4.   

    Private Sub Form_Load()
    Dim a(1 To 4) As Long
    Dim i As Long
    a(1) = 16
    a(2) = 16
    a(3) = 16
    a(4) = 16For i = UBound(a) To LBound(a) Step -1
        Call Rtn(i, a())
    NextFor i = LBound(a) To UBound(a)
        Debug.Print a(i)
    NextEnd SubSub Rtn(ByVal lIndex As Long, a() As Long)
        Dim i As Long
        For i = LBound(a) To UBound(a)
            If i <> lIndex Then
                a(lIndex) = a(lIndex) + a(i) / 2
                a(i) = a(i) / 2
            End If
        Next
      

  5.   

    Private Sub Form_Load()
        Dim a(1 To 4) As Long
        Dim i As Long
        a(1) = 16
        a(2) = 16
        a(3) = 16
        a(4) = 16
        'a(...)
        
        For i = UBound(a) To LBound(a) Step -1
            Call Rtn(i, a())
        Next
        
        For i = LBound(a) To UBound(a)
            Debug.Print a(i)
        Next
    End SubSub Rtn(ByVal lIndex As Long, a() As Long)
        Dim i As Long
        For i = LBound(a) To UBound(a)
            If i <> lIndex Then
                a(lIndex) = a(lIndex) + a(i) / 2
                a(i) = a(i) / 2
            End If
        Next
    End Sub
      

  6.   

    to bideyore:
       大家请注意:   分给其他三个人指的是: 其他三个人分的糖的总数之和加倍!!!!   并不是说让其余三个人每一个人的糖数加倍!!   这下子大家明白了??   若让每一个人都加倍,呵呵,我看也用不着问了!!   谢谢大家!继续努力!!
      

  7.   

    to lsftest:
       中间结果就不用了!因为同一个初始值,有很多分发达到最后所要求的结果!
       只要能证明这一组数能够有方法分成最后大家都是16,就输出,然后进行下一组数的验证。
      

  8.   

    Private Sub Step1(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer, ByVal d As Integer)
    Dim i As Integer, j As Integer
    '甲
    a = a / 2
    For i = 0 To a
        For j = 0 To a - i
           If step2(a, b + i, c + j, d + a - i - j) Then Exit Sub
        Next
    Next
    End Sub
    Private Function step2(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer, ByVal d As Integer) As Boolean
    '乙
    Dim i As Integer, j As Integer
    If b Mod 2 <> 0 Then Exit Function
    b = b / 2
    For i = 0 To b
        For j = 0 To b - i
           If step3(a + i, b, c + j, d + b - i - j) Then step2 = True
           Exit Function
        Next
    Next
    End Function
    Private Function step3(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer, ByVal d As Integer) As Boolean
    '丙
    Dim i As Integer, j As Integer
    If c Mod 2 <> 0 Then Exit Function
    c = c / 2
    For i = 0 To c
        For j = 0 To c - i
          If step4(a + i, b + j, c, d + c - i - j) Then step3 = True
          Exit Function
        Next
    Next
    End Function
    Private Function step4(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer, ByVal d As Integer) As Boolean
    '丁
    Dim i As Integer, j As Integer
    If d <> N / 2 Then Exit Function
    d = d / 2
    For i = 0 To d
        For j = 0 To d - i
           If step5(a + i, b + j, c + d - i - j, d) Then step4 = True
           Exit Function
        Next
    Next
    End Function
    Private Function step5(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer, ByVal d As Integer) As Boolean
    If a = b And b = c And c = d Then
       Text1.Text = Text1.Text & aa(0) & " " & aa(1) & " " & aa(2) & " " & aa(3) & " " & vbCrLf
       step5 = True
    End If
    End Function
    Private Sub Command2_Click()
    Dim i As Integer, j As Integer
    Dim a As Integer, b As Integer, c As Integer, d As Integer
    Text1.Text = ""
    For a = 2 To N Step 2
        For b = 0 To N - a
            For c = 0 To N - a - b
                aa(0) = a
                aa(1) = b
                aa(2) = c
                aa(3) = N - a - b - c
                Step1 a, b, c, N - a - b - c
            Next
        Next
    Next
    End Sub
    '算出来结果还是有点少