Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Program VB w Excelu wybierający max. ilość liczb dających 0

panplutooo 08 Wrz 2011 13:26 1253 2
  • #1 08 Wrz 2011 13:26
    panplutooo
    Poziom 2  

    Witam,

    tak jak w temacie próbuję napisać makro, które wybierałoby maxymalną ilość liczb (zaznaczając je), które łącznie dają sumę 0.

    Oczywiście część z nich jest dodatnia a część ujemna.

    Próbowałem wymyśleć jakiś algorytm lub podejść od strony matematycznej lecz bezskutecznie.

    Przykładowy plik jest w załączniku.


    Bardzo prosłbym o jakąś pomoc lub wskazówki.

    Pozdrawiam,

    Mateusz

    0 2
  • #2 09 Wrz 2011 19:19
    adamas_nt
    Moderator Programowanie

    Pomyśl ile to kombinacji. Żeby znaleźć maksymalną liczbę składników trzeba zaczynać od porównania sum. Pobawiłem się trochę i oto wyniki:

    W kolumnie M umieściłem funkcje, kolejno:
    =SUMA.JEŻELI(A:A;"<0") daje liczbę -112561291,98
    =SUMA.JEŻELI(A:A;">0") daje liczbę 112685563,27
    różnica to 124271,29
    =LICZ.JEŻELI(A:A;"<0") to 379
    =LICZ.JEŻELI(A:A;">0") to 378
    razem 757

    Zapuściłem na minutę taką pętlę

    Kod: vb
    Zaloguj się, aby zobaczyć kod
    Liczniki: "i" doszło do wartości 4, "j", co mniej istotne, do 757. Zmienna "licznik" osiągnęła wartość 1707811. Przejście całej pętli zajęłoby ok 4godz. a to tylko 3 składniki. Ustawiając wyjście z pętli przy wartościach spoza zakresu (linia 6 z apostrofem) skrócimy czas o kilkanaście/kilkadziesiąt minut.

    Czyli "klasyczne" podejście odpada.

    Zrobiłbym tak: Sumuję dodatnie i ujemne, konwertuję na bezwzględne. Szukam max 2 liczb równych różnicy. Jeśli nie znajdzie odejmuję najmniejszą ze zbioru (w zależności od tego która suma + czy - ma większą wartość bezwzględną) i szukam ponownie dwóch. Itd, do momentu gdy różnica jest większa od sumy dwóch największych liczb przeciwnego znaku. Tu kończę i poddaję :)

    0
  • #3 10 Wrz 2011 10:59
    118460
    Użytkownik usunął konto