05. juli 2017 - 17:36
Der er
9 kommentarer og
1 løsning
Udfordring :-) - Gruppering af tilfældige tal
Hej
Jeg har fået en "udfordring" på arbejde, jeg ikke selv kan knække :-(
Har en række tilfældige tal fra 1 - 4, der skal grupperes så de giver 8 i hver gruppe.
Eks. på tal 4,2,3,1,3,2,4,3,2,4,3,2,1,4,4,2............
De skal nu grupperes, så hver gruppe giver 8
4+4 = 8
4+4 = 8
osv. til 4 ikke optræder mere
Næste
4+3+1
3+3+2
3+3+1+1
3+2+2+1
osv.......
Den sidste gruppe kan så ende på en tilfældig sum, hvis ikke summen af tal går lige op når de deles med 8. (summen af tal er maksimum 288)
3+2+1 (kunne være slutningen.
Nogen der kan knække den i sommervarmen, så tager jeg hatten af :-)
God sommer til jer alle
Løsningen kan afhænge af i hvilken rækkefølge man tager tallene.
Eksempel:
4 3 3 3 3 2 2
Hvis man tager grupper med 4 først (som du skriver), vil man først tage (4,2,2) og så ende med (3,3,3,3)=12 i rest.
Hvis man tager 3 først (som er de "svære" at komme af med), vil man tage (3,3,2) og (3,3,2) og ende med (4) som rest.
Kan du bekræfte, at det er det først du ønsker - altså at der skal tages grupper fra startende med det/de størst mulige tal?
05. juli 2017 - 22:49
#10
Rækkefølgen betyder ikke noget, så det afgørende er bare hvor mange du har af hver. I dit eksempel har du 2x1,5x2,4x3 og 5x4 = { 2,5,4,5 }.
Du fjerner
4 4
4 4
1 3 4
2 3 3
1 2 2 3
og ender med at have
2x2 tilbage.
Kode:
Sub test()
Dim mycombi As Variant
Dim combis As Variant
Dim i As Integer
mycombi = [ { 2,5,4,5 } ]
combis = [ { 0,0,0,2; 1,0,1,1; 0,2,0,1; 2,1,0,1; 4,0,0,1; 0,1,2,0; 2,0,2,0; 1,2,1,0; 3,1,1,0; 5,0,1,0; 0,4,0,0; 2,3,0,0; 4,2,0,0; 6,1,0,0; 8,0,0,0 } ]
s = "Start: " & printCombi(mycombi) & vbNewLine
For i = 1 To UBound(combis, 1)
Do While foundCombi(i, combis, mycombi)
s = s & "Fjernet: " & popCombi(i, combis, mycombi) & vbNewLine
Loop
Next i
s = s & "Rest: " & printCombi(mycombi)
MsgBox s
End Sub
Function foundCombi(n As Integer, combis As Variant, mycombi As Variant) As Boolean
Dim i As Integer
foundCombi = True
For i = 1 To UBound(combis, 2)
If mycombi(i) < combis(n, i) Then
foundCombi = False
Exit For
End If
Next i
End Function
Function popCombi(n As Integer, combis As Variant, ByRef mycombi As Variant) As String
Dim i As Integer
popCombi = ""
For i = 1 To UBound(combis, 2)
mycombi(i) = mycombi(i) - combis(n, i)
For j = 1 To combis(n, i)
popCombi = popCombi & " " & i
Next j
Next i
End Function
Function printCombi(mycombi As Variant) As String
Dim i As Integer
printCombi = ""
For i = 1 To UBound(mycombi)
printCombi = printCombi & i & ": " & mycombi(i) & " "
Next i
End Function
Synes godt om
1 synes godt om dette