7,762
社区成员
发帖
与我相关
我的任务
分享
每件重量(g) 数量
3.7 58
5.2 479
5.1 386
5.8 492
5.3 520
5.5 650
5.4 687
5.6 368
5.9 309
4.9 42
5 218
5.7 382
4.8 20
4.7 6
4.6 2
6.4 24
.
.
.
5.3 5.5 5.5 5.5 5.6 5.6 5.6 5.6 5.8
5.2 5.4 5.5 5.5 5.5 5.6 5.7 5.8 5.8
5.1 5.2 5.3 5.4 5.7 5.7 5.8 5.9 5.9
5.3 5.3 5.5 5.5 5.5 5.6 5.7 5.8 5.8
5.2 5.4 5.5 5.5 5.5 5.6 5.7 5.7 5.9
5.3 5.4 5.4 5.4 5.5 5.6 5.8 5.8 5.8
5.2 5.3 5.4 5.5 5.6 5.7 5.7 5.8 5.8
5.1 5.2 5.3 5.5 5.6 5.8 5.8 5.8 5.9
3.7 3.7 5.1 5.1 5.2 5.3 5.4 5.4 5.5 5.6
3.7 3.7 5.1 5.2 5.2 5.2 5.3 5.4 5.6 5.6
3.7 3.7 5.2 5.2 5.2 5.2 5.3 5.3 5.4 5.8
3.7 3.7 5.2 5.2 5.2 5.2 5.2 5.4 5.5 5.7
3.7 3.7 5.2 5.2 5.3 5.3 5.3 5.4 5.4 5.5
3.7 3.7 5.1 5.2 5.2 5.3 5.3 5.4 5.5 5.6
3.7 3.7 5.1 5.1 5.1 5.3 5.4 5.4 5.5 5.7
3.7 3.7 5.1 5.1 5.2 5.2 5.2 5.5 5.5 5.8
.
.
.
Option Explicit
Dim lngRow As Long
Const LostNumberException As Long = vbObjectError + 512
Sub 组合算法()
Sheet2.Cells.Clear
lngRow = 1
Dim dctData As Object
Set dctData = CreateObject("scripting.dictionary")
With Sheet1
Dim i As Long
i = 2
While .Cells(i, 1) <> ""
Dim strKey As String
strKey = .Cells(i, 1)
If Not dctData.exists(strKey) Then
dctData.Add strKey, .Cells(i, 2)
Else
dctData.Item(strKey) = dctData.Item(strKey) + .Cells(i, 2)
End If
i = i + 1
Wend
End With
Debug.Print "[配前]"
PrintStatics dctData
SortData dctData
Dim colData As Collection
Set colData = New Collection
On Error GoTo hErr
Calc dctData, colData, 0, 1
Debug.Print "[配后剩余]"
PrintStatics dctData
PrintData dctData
MsgBox "组合完成!"
Exit Sub
hErr:
Select Case Err.Number
Case LostNumberException
For i = 1 To colData.Count
colData.Remove 1
Next
SortData dctData
Resume
Case Else
MsgBox Err.Number & ": " & Err.Description, vbCritical
End Select
End Sub
Sub PrintStatics(ByVal dctData As Object)
Dim kezhong As Double
kezhong = 0
Dim geshu As Long
geshu = 0
Dim varKey As Variant
For Each varKey In dctData
kezhong = kezhong + CDbl(varKey) * CDbl(dctData(varKey))
geshu = geshu + CLng(dctData(varKey))
Next
Debug.Print "克重: " & kezhong
Debug.Print "个数: " & geshu
End Sub
Sub SortData(ByVal dctData As Object)
Dim dctTemp As Object
Set dctTemp = CreateObject("scripting.dictionary")
Dim varKey As Variant
For Each varKey In dctData
dctTemp.Item(varKey) = dctData.Item(varKey)
Next
dctData.RemoveAll
Do
Dim varMaxKey As Variant
varMaxKey = Null
For Each varKey In dctTemp
If IsNull(varMaxKey) Then
varMaxKey = varKey
ElseIf dctTemp(varMaxKey) < dctTemp(varKey) Then
varMaxKey = varKey
End If
Next
dctData.Add varMaxKey, dctTemp(varMaxKey)
dctTemp.Remove varMaxKey
Loop While dctTemp.Count > 0
End Sub
Sub Calc(ByVal dctData As Variant, ByVal colData As Collection, ByVal dblSum As Double, ByVal lngLastIndex As Long)
If Not Check(dctData, colData) Then
Exit Sub
End If
If dblSum = 50 Then
Do
Dim i As Long
For i = 1 To colData.Count
Sheet2.Cells(lngRow, i) = colData(i)
Next
Reduce dctData, colData
lngRow = lngRow + 1
Loop While Check(dctData, colData)
Dim blnZero As Boolean
blnZero = False
Dim varItem As Variant
For Each varItem In colData
If dctData(varItem) = 0 Then
If dctData.exists(varItem) Then
dctData.Remove varItem
blnZero = True
End If
End If
Next
If blnZero Then
Err.Raise LostNumberException
End If
End If
i = 0
Dim varKey As Variant
For Each varKey In dctData
i = i + 1
If i >= lngLastIndex Then
If dctData(varKey) > 0 Then
Dim dblNewSum As Double
dblNewSum = dblSum + varKey
If dblNewSum <= 50 Then
colData.Add varKey
Calc dctData, colData, dblNewSum, i
colData.Remove colData.Count
Else
Static datLast As Date
If DateDiff("s", datLast, Now) >= 1 Then
datLast = Now
DoEvents
End If
End If
End If
End If
Next
End Sub
Function Check(ByVal dctData As Variant, ByVal colData As Collection) As Boolean
Static dctTemp As Object
If dctTemp Is Nothing Then
Set dctTemp = CreateObject("scripting.dictionary")
Else
dctTemp.RemoveAll
End If
Dim varItem As Variant
For Each varItem In colData
If dctTemp.exists(varItem) Then
dctTemp.Item(varItem) = dctTemp.Item(varItem) + 1
Else
dctTemp.Add varItem, 1
End If
Next
Dim varKey As Variant
For Each varKey In dctTemp
If dctTemp(varKey) > dctData(varKey) Then
Check = False
Exit Function
End If
Next
Check = True
End Function
Sub Reduce(ByVal dctData As Variant, ByVal colData As Collection)
Dim varItem As Variant
For Each varItem In colData
dctData.Item(varItem) = dctData.Item(varItem) - 1
Next
DoEvents
End Sub
Sub PrintData(ByVal dctData As Object)
Dim varKey As Variant
For Each varKey In dctData
Debug.Print varKey & " => " & dctData(varKey)
Next
End Sub