|
Titlul: Împărţirea unei mulţimi în 2 submulţimi de sume cât mai apropiate Scris de: Vidrean Mihai din Ianuarie 29, 2012, 17:32:17 Buna!!!Ma puteti ajuta cu niste indicatii de rezolvare la problema urmatoare:
La sfarsitul noptii de Craciun, Mosul a poposit la bradul a doi frati, unde si-a golit sacul. Cand s-au trezit, fratii au intrat intr-o mare dilema: cum isi vor imparti ei cadourile mosului? Stiind ca fiecare cadou are o valoare (cuprinsa intre 1 si 100 inclusiv) si ca sunt maxim 100 de cadouri scrieti un program care sa determine sumele cadourilor fratilor, precum si modul de impartire, astfel incat sumele obtinute sa fie cele mai apropiate posibil. Date de intrare: In fisierul CADOURI.IN se gasesc informaţiile referitoare la cadouri: pe prima linie numarul total de cadouri, pe urmatoarea linie valorile lor. Date de iesire: In fişierul CADOURI.OUT trebuie scrise doua sume care sunt cele mai apropiate corespunzătoare unei impartiri a cadourilor, pe a doua linie valorile corespunzătoare cadourilor care însumează prima suma găsită, pe a treia linie, valorile corespunzătoare cadourilor care însumează a doua suma găsită. Exemplu: CADOURI.IN 7 28 7 11 8 9 7 27 CADOURI.OUT 48 49 28 11 9 7 8 7 27 Titlul: Răspuns: Împărţirea unei mulţimi în 2 submulţimi de sume cât mai apropiate Scris de: FMI Ciprian Olariu din Ianuarie 29, 2012, 18:18:13 Problema se rezolva cu programare dinamica (problema rusacului). Sa presupunem ca avem suma totala a valorilor cadourilor egala cu S (S va fi maxim 10.000). Dupa asta facem problema rucsacului,adica vom incerca sa vedem care este cea mai mare suma <= S/2 care poate fi obtinuta si astfel am gasit solutia,pentru ca restul sumei pana la S va fi suma obtinuta pentru al doilea copil si intrucat prima este maxima pana in S/2 atunci diferenta dintre cele doua va fi minima :thumbup: Numarul de iteratii va fi (S/2)*N , unde N e numarul de cadouri , deci cam 500.000 maxim :)
Titlul: Răspuns: Împărţirea unei mulţimi în 2 submulţimi de sume cât mai apropiate Scris de: Paul-Dan Baltescu din Ianuarie 29, 2012, 19:22:05 http://infoarena.ro/problema/jocul
Si exemplul e acelasi. :) Titlul: Răspuns: Împărţirea unei mulţimi în 2 submulţimi de sume cât mai apropiate Scris de: Vidrean Mihai din Ianuarie 29, 2012, 21:48:38 Am facut cum mi-a sugerat scipianus cu problema rucsacului si merge tot inafara de ultimul test la care iau TLE.Ce optimizare pot sa-i mai fac??Am incercat citirea si scriere si cu fstream si cu cstdio aceealasi lucru TLE ](*,) : http://infoarena.ro/job_detail/670732 (http://infoarena.ro/job_detail/670732)
P.S.:Cum as putea face ca sa afisez si din ce numere este formata fiecare suma ca si in exemplu ?? :-'(la jocul se cerea numai cele doua sume) Cod: #include<fstream> Titlul: Răspuns: Împărţirea unei mulţimi în 2 submulţimi de sume cât mai apropiate Scris de: Paul-Dan Baltescu din Ianuarie 29, 2012, 22:16:57 Poti face folosind o singura linie pentru dinamica si facand for-ul din mijloc descrescator.
Titlul: Răspuns: Împărţirea unei mulţimi în 2 submulţimi de sume cât mai apropiate Scris de: Vidrean Mihai din Ianuarie 29, 2012, 22:41:35 Nu m-am prins ca mergea cu o sigura linie :aha:
Mersi mult :winner1: O ultima intrebare :D : Cum as putea sa retin si numere din care e formata fiecare suma?? :-k (48=28+11+9 si 49=7+8+7+27) Titlul: Răspuns: Împărţirea unei mulţimi în 2 submulţimi de sume cât mai apropiate Scris de: Paul-Dan Baltescu din Ianuarie 30, 2012, 01:17:22 Cel mai simplu este sa calculezi o informatie suplimentara b[ i ][ j ] = 0 / 1 daca pe D[ i ][ j ] l-ai calculat din D[ i-1 ][ j ] sau D[ i-1 ][ j-G[ i ] ].
E mai greu folosind spatiu liniar. |