作者yauhh (哟)
看板Visual_Basic
标题Re: [VBA ] 想请教关於Excel的问题
时间Wed Jan 30 17:50:28 2013
※ 引述《kain1230 (简单至上)》之铭言:
: 不好意思,最近和学生在讨论一个填数问题,目前遇到组合大过庞大,
: 因此人工计算过於繁复,想藉助Excel来解决,
: 我们有16个变量 a,b,c,...,p
: 每个变量都是1到16的正整数,且各自彼此都不同,
: 我们处理得到的方程有以下几个
: a+b+c+d+e+f+g=49
: 2*b+c+2*d+e+2*f+g=87
: h+i+j=d+e+f
: k+l+m=b+g+f
: n+o+p=b+c+d
用基本的排列方法,我写的是这样: 没有设定一些捷径跳线之类的优化,
跑了约16小时做到的排列是 1,2, 3, 7, ... 用1.5GHz, 1.99GB的电脑.
不过到此为止还没找到解.
Sub MyPerm()
Dim a(0 To 15) As Integer
For i = 0 To 15
a(i) = i + 1
Next i
GenPermutation a, 0
End Sub
Sub GenPermutation(Arr() As Integer, base As Integer, Optional RowNum As
Integer = 1)
If base >= UBound(Arr) Then
If check(Arr) = True Then
listNumbers Arr, RowNum
RowNum = RowNum + 1
End If
DoEvents
Else
For i = base To UBound(Arr)
swap Arr(base), Arr(i)
GenPermutation Arr, base + 1, RowNum
swap Arr(base), Arr(i)
Next i
End If
End Sub
Sub swap(a, b)
t = a
a = b
b = t
End Sub
Sub listNumbers(Arr() As Integer, RowNum As Integer)
If LBound(Arr) > UBound(Arr) Then
Else
For i = LBound(Arr) To UBound(Arr)
Sheet1.Cells(RowNum + 1, i + 1) = Arr(i)
Next i
End If
End Sub
Function check(Arr() As Integer) As Boolean
Dim result As Boolean
result = True
result = result And (sum(Arr, 0, 1, 2, 3, 4, 5, 6) = 49)
If result = False Then Exit Function
result = result And (sum(Arr, 1, 1, 2, 3, 3, 4, 5, 5, 6) = 87)
If result = False Then Exit Function
result = result And (sum(Arr, 7, 8, 9) = sum(Arr, 3, 4, 5))
If result = False Then Exit Function
result = result And (sum(Arr, 10, 11, 12) = sum(Arr, 1, 5, 6))
If result = False Then Exit Function
result = result And (sum(Arr, 13, 14, 15) = sum(Arr, 1, 2, 3))
check = result
End Function
Function sum(Arr() As Integer, ParamArray i() As Variant) As Integer
sum = 0
For j = LBound(i) To UBound(i)
sum = sum + Arr(i(j))
Next j
End Function
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.167.54.90
1F:推 ClubT:我觉得可以到 Prob_Solve 板去问问 01/30 22:25
2F:推 EdisonX:奇偶特性应可拿来做一点点加速应用 ? 01/30 23:14
3F:→ EdisonX:ex, (c+e+g)=odd, a+b+d+f=even, ... 01/30 23:14
4F:→ EdisonX:( 还有 a mod 2 == (b+d+f) mod 2 ) 01/30 23:16