2010年9月11日 星期六

分房子


有個富翁,手上有 N 間房子,想要分送給一些朋友。例如 N = 5,那有以下的七種分法:
5
4 + 1
3 + 2
3 + 1 + 1
2 + 2 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1
然而,在富翁所在的國家,偶數被視為是不吉利的。因此,送偶數間的房子給朋友,是禁忌的行為,因此富翁實際上只有三種可行的分法:
5
3 + 1 + 1
1 + 1 + 1 + 1 + 1
給定任意的正整數 N (介於 1 到 750 間),請幫富翁算算到底有多少種可行的分法?
輸入說明 :
輸入檔的第一行有一個正整數 M,代表有 M 組測試資料。以下的 M 行各有一個正整數 N。
輸出說明 :
對於每一組測試資料 N,輸出有幾種可行的(不含偶數的)分法。

範例輸入 :
 5 
2
 5
 4
範例輸出 :

3  3 2
                  貼文 BY 阿揚

4 則留言:

  1. Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Me.Hide
    Do Until EOF(1)
    Input #1, x
    For i = 1 To x
    Input #1, y
    k = 0
    Call check(y, y - 1, "", k)
    Print #2, k,
    Print
    Next i
    Loop
    End
    Close #2
    Close #1
    End Sub
    Sub check(ByVal a, ByVal b, ByRef c As String, k)
    If a = 0 Then
    If InStr(c, "2") = 0 Then
    k = k + 1
    End If
    Else
    For i = b To 1 Step -1
    If (a - i) >= 0 Then Call check(a - i, i, c & i, k)
    Next i
    End If
    End Sub
    by 阿揚

    回覆刪除
  2. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    While Not EOF(1)
    Input #1, Q
    For i = 1 To Q
    LS.Clear
    Input #1, x
    If x Mod 2 <> 0 Then LS.AddItem x
    Call Check(x, x - 1, "")
    Print #2, LS.ListCount
    Next i
    Print #2,
    Wend
    Close #2
    Close #1
    End
    End Sub
    Sub Check(ByVal a, ByVal b, ByRef c As String)
    If a = 0 Then
    For i = 1 To Len(c)
    aa = Val(Mid(c, i, 1))
    If aa Mod 2 = 0 Then GoTo isN
    Next i
    LS.AddItem c
    isN:
    End If
    For i = b To 1 Step -1
    If a - i >= 0 Then Call Check(a - i, i, c & i)
    Next i
    End Sub

    By小白

    回覆刪除
  3. Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Me.Hide
    Do Until EOF(1)
    Input #1, x
    For i = 1 To x
    Input #1, y
    k = 0
    If y Mod 2 <> 0 Then k = k + 1
    Call check(y, y - 1, "", k)
    Print k,
    Print
    Next i
    Loop
    Close #2
    Close #1
    End
    End Sub
    Sub check(ByVal a, ByVal b, ByRef c As String, k)
    If a = 0 Then
    o = True
    For i = 1 To Len(c)
    If Val(Mid(c, i, 1)) Mod 2 = 0 Then o = False: Exit For
    Next i
    If o Then k = k + 1
    Else
    For i = b To 1 Step -1
    If (a - i) >= 0 Then Call check(a - i, i, c & i, k)
    Next i
    End If
    End Sub
    BY 阿楊
    發現嚴重錯誤!!! 上面對純屬巧合=口="

    回覆刪除
  4. 阿揚,
    你的題目的輸入輸出,是錯的吧。再檢查看看。

    熊掌

    回覆刪除