18. marts 2008 - 13:27Der er
10 kommentarer og 2 løsninger
Udregning af kombinationer
I forbindelse med et projekt har jeg behov for en funktion som kan finde alle kombinationer af et problem. Problemet skal forståes på den måde at man f.eks. har et rør som er 300 cm langt. Jeg er interesseret i at få skrevet en kode som selv kan finde alle de mulige kombinationer som opstår hvis man vil skære røret op i længder af: 40, 80, 110, 130, 150, 180, 210 cm.
Altså - man kan f.eks. skære 7 stykker på 40 cm 6 styker på 40 cm 5 stykker på 40 cm og et stykke på 80 cm 4 stykker på 40 cm og to stykker på 80 cm ...... Listen bliver hurtig lang og ville derfor gerne, hvis nogen kunne hjælpe med at skrive en kode som kunne regne det for mig.
If totalLen <= maksLen Then If antal40 <> 0 Then Console.Write(antal40 & " stk. á 40 cm, ") If antal80 <> 0 Then Console.Write(antal80 & " stk. á 80 cm, ") If antal110 <> 0 Then Console.Write(antal110 & " stk. á 110 cm, ") If antal130 <> 0 Then Console.Write(antal130 & " stk. á 130 cm, ") If antal150 <> 0 Then Console.Write(antal150 & " stk. á 150 cm, ") If antal180 <> 0 Then Console.Write(antal180 & " stk. á 180 cm, ") If antal210 <> 0 Then Console.Write(antal210 & " stk. á 210 cm, ")
Jeg kunne godt tænke mig at have det sat op i excel, men jeg er ikke helt sikker på hvordan jeg lige gør det. Outputtet skulle gerne komme til at se sådan her ud:
Det skal forståes sådan at: kolonne 1 viser at et rør kan skæres i 1 stk af 210 og 1 stk af 80 (spild på 10) kolonne 2: 1 stk på 210 og 2 stk på 40 (samt spild på 10) kolonne 3: 1 stk på 210 og 1 stk på 40 (samt spild på 50)
Hvordan får jeg lavet den løkke, som først udfylder kolonne 1 og derefter kolonne 2, samtidig med at jeg sikrer at alle løsninger er forskellige?
If totalLen <= maksLen Then If antal40 <> 0 Then indsæt antal40, 7, kol If antal80 <> 0 Then indsæt antal80, 6, kol If antal110 <> 0 Then indsæt antal110, 5, kol If antal130 <> 0 Then indsæt antal130, 4, kol If antal150 <> 0 Then indsæt antal150, 3, kol If antal180 <> 0 Then indsæt antal180, 2, kol If antal210 <> 0 Then indsæt antal210, 1, kol
Man kan undgå de nestede løkker med brug af rekursion.
Sub combisplit2(maxlen As Integer, lens As Variant, n() As Integer, curlen As Integer, start As Integer) Dim i As Integer Dim s As String If lens(0) > maxlen - curlen Then s = "" For i = 0 To UBound(lens) s = s & " " & n(i) Next MsgBox s Else i = start While i <= UBound(lens) If lens(i) <= maxlen - curlen Then n(i) = n(i) + 1 Call combisplit2(maxlen, lens, n, curlen + lens(i), i) n(i) = n(i) - 1 End If i = i + 1 Wend End If End Sub
Sub combisplit(maxlen As Integer, lens As Variant) Dim n() As Integer ReDim n(UBound(lens)) Call combisplit2(maxlen, lens, n, 0, 0) End Sub
Sub test() Call combisplit(300, Array(40, 80, 110, 130, 150, 180, 210)) End Sub
Hvordan ville man skulle skrive koden så man ikke var låst af den syv længder. Altså så den trækker input fra en række og det er lige meget om det er for syv, to eller andre kombinationer af længder. Tænker på, hvordan det kan laves så brugerfladen i excel bliver bedre - så man ikke hele tiden skal være i macroen hvis det ikke lige er syv længder.
Jeg har angivet den rekursive algoritme det kan klare det.
Der mangler kun lidt integration med Excel (kan muligvis være sværere end man umiddelbart skulle tro).
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.