Natrafiłem na następujące stwierdzenie problemu.Podziel tablicę w równym rozmiarze, tak aby wartość podanej funkcji była minimalna.
Masz listę liczb naturalnych wielkości
N
i trzeba rozpowszechniać wartości w dwóch listachA
iB
wielkościN/2
, tak że do kwadratu sumyA
elementów jest najbliższy możliwy do mnożeniaB
elementy.przykład: uznaje wyliczenia 7 11 1 9 10 3 5 13 9 12.
Optymalny rozkład jest:
Lista A: 5 9 9 12 13
Zestawienie B: 1 3 7 10 11
co prowadzi do różnicy abs ((5 + 9 + 9 + 12 + 13)^2 - (1 * 3 * 7 * 10 * 11)) = 6
Twój program powinien wyprowadzić 6, co jest minimum Różnica, którą można osiągnąć.
Co próbowałem:
Próbowałem Greedy podejście w celu rozwiązania tego problemu. Wziąłem dwie zmienne: sum
i mul
. Teraz zacząłem pobierać elementy z podanego zestawu jeden po drugim i próbowałem dodawać go zarówno do zmiennych, jak i do obliczonego bieżącego kwadratu sumy i mnożenia. Teraz sfinalizuj element w jednym z dwóch zestawów, tak aby kombinacja zapewniała minimalną możliwą wartość.
Ale to podejście nie działa w danym przykładzie itselt. Nie wiem, jakie podejście można tu zastosować.
Jestem nie z prośbą o podanie dokładnego kodu rozwiązania. Wszelkie możliwe podejście i powód, dla którego działa, byłoby w porządku.
EDIT:
Źródło: CodinGame, Community puzzle
Z jakim problemem napotykasz swoje podejście? –
Co powiesz na uzyskanie wszystkich możliwych kombinacji wielkości n/2 (tutaj jest przykład https://stackoverflow.com/questions/2201113/combinatoric-n-choose-r-in-java-math) dla każdej kombinacji obliczyć sqrSum i produkt umieścił wszystkie wyniki w jednej kolekcji przejdzie przez to w pewnym momencie zobaczysz sqrtSum a produkt jako sąsiedzi znajdzie parę z najmniejszą różnicą – urag
@urag Warto zauważyć, że zajmie to czas wykładniczy - jeśli n jest nawet tak małe jak około 50 będziesz miał problemy. Zwykle rozwiązanie problemu brute-force w trybie wykładniczym jest oczywiste w przypadku takich problemów, kluczem jest znalezienie mądrzejszego sposobu rozwiązania problemu. – Dukeling