用G表示物品,Left、Right表示左右: --------------------------------------------------- Weight | Left | Right --------------------------------------------------- 1 | 1 | G 2 | 3 | G + 1 3 | 3 | G 4 | 1 + 3 | G 5 | 9 | G + 1 + 3 6 | 9 | G + 3 7 | 1 + 9 | G + 3 8 | 9 | G + 1 9 | 9 | G 10 | 1 + 9 | G 11 | 3 + 9 | G + 1 .....
把我的程序贴上吧,虽然不如 baizhj(baizhj) 的简洁 毕竟也是心血,而且我的程序可以找到所有的满足条件的数(把40这个数换掉的话) Option Explicit Const MaxNum = 40 Private Sub Command1_Click() getArr End Sub Private Sub getArr() Dim i As Long Dim j As Long Dim k As Long Dim m As Long
txt1.Text = "" For i = 1 To MaxNum - 3 For j = i To MaxNum - 3 - i For k = j To MaxNum - 3 - i - j m = MaxNum - i - j - k If m >= k Then txt1.Text = txt1.Text & i & " " & j & " " & k & " " & m & " △△△△ " If i = 1 And j = 2 And k = 4 And m = 8 Then Debug.Assert False End If If CheckData(i, j, k, m) Then Debug.Print i, j, k, m End If End If Next k Next j Next i Debug.Print "finsh!" End SubPrivate Function CheckData(X1 As Long, X2 As Long, X3 As Long, X4 As Long) As Boolean Dim t As Long Dim i As Long Dim j As Long Dim k As Long Dim m As Long Dim blnT(MaxNum) As Boolean Dim Num(4) As Long
For i = 1 To MaxNum blnT(i) = False Next i Num(1) = X1 Num(2) = X2 Num(3) = X3 Num(4) = X4 '注意数组是有序的'Num(1)<=Num(2)<=Num(3)<=Num(4) For i = -1 To 1 For j = -1 To 1 For k = -1 To 1 For m = -1 To 1 t = i * Num(1) + j * Num(2) + k * Num(3) + m * Num(4) If t > 0 Then blnT(t) = True Next Next Next Next
For i = 1 To MaxNum If blnT(i) = False Then txt1.Text = txt1.Text & i & vbCrLf CheckData = False DoEvents Exit Function
q^0+q^1+q^2+q^3=40
求q=?
-->q=3
所以:
1、3、9、27
一下就看到了本质
---------------------------------------------------
Weight | Left | Right
---------------------------------------------------
1 | 1 | G
2 | 3 | G + 1
3 | 3 | G
4 | 1 + 3 | G
5 | 9 | G + 1 + 3
6 | 9 | G + 3
7 | 1 + 9 | G + 3
8 | 9 | G + 1
9 | 9 | G
10 | 1 + 9 | G
11 | 3 + 9 | G + 1
.....
毕竟也是心血,而且我的程序可以找到所有的满足条件的数(把40这个数换掉的话)
Option Explicit
Const MaxNum = 40
Private Sub Command1_Click()
getArr
End Sub
Private Sub getArr()
Dim i As Long
Dim j As Long
Dim k As Long
Dim m As Long
txt1.Text = ""
For i = 1 To MaxNum - 3
For j = i To MaxNum - 3 - i
For k = j To MaxNum - 3 - i - j
m = MaxNum - i - j - k
If m >= k Then
txt1.Text = txt1.Text & i & " " & j & " " & k & " " & m & " △△△△ "
If i = 1 And j = 2 And k = 4 And m = 8 Then
Debug.Assert False
End If
If CheckData(i, j, k, m) Then
Debug.Print i, j, k, m
End If
End If
Next k
Next j
Next i
Debug.Print "finsh!"
End SubPrivate Function CheckData(X1 As Long, X2 As Long, X3 As Long, X4 As Long) As Boolean
Dim t As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim m As Long
Dim blnT(MaxNum) As Boolean
Dim Num(4) As Long
For i = 1 To MaxNum
blnT(i) = False
Next i
Num(1) = X1
Num(2) = X2
Num(3) = X3
Num(4) = X4
'注意数组是有序的'Num(1)<=Num(2)<=Num(3)<=Num(4)
For i = -1 To 1
For j = -1 To 1
For k = -1 To 1
For m = -1 To 1
t = i * Num(1) + j * Num(2) + k * Num(3) + m * Num(4)
If t > 0 Then blnT(t) = True
Next
Next
Next
Next
For i = 1 To MaxNum
If blnT(i) = False Then
txt1.Text = txt1.Text & i & vbCrLf
CheckData = False
DoEvents
Exit Function
End If
Next
CheckData = True
End Function
等比数列问题(比例为q),或者q进制问题:
q^0+q^1+q^2+q^3=40
求q=?
-->q=3
所以:
1、3、9、27
不明白你根据什么得到的!??讲讲好吗?
http://community.csdn.net/Expert/topic/2883/2883535.xml?temp=3.181094E-02