Kezdőoldal » Tudományok » Egyéb kérdések » Hogyan lehet az 1-től 900-ig...

Hogyan lehet az 1-től 900-ig egész számok közül 30-at kiválasztani úgy, hogy a kiválasztottak közül bármely kettő összege mindig különböző legyen?

Figyelt kérdés

B) 900 helyett melyik a legkisebb szám, amikor még ki lehet választani?


Pl. 1,2,3 után a 4 már nem jó, mert 1+4=2+3

1,2,3,5 után a 6 vagy 7 már nem jó, mert 1+6=2+5 , 1+7=3+5

(De természetesen nem kell a legkisebb jót választani.)

Jó lenne pl. a Fibonacci-sor, de túl gyorsan növekszik.

Előre is köszönöm.



2013. okt. 25. 23:07
 1/9 anonim ***** válasza:

Én 27 darabot találtam, de lehet, hogy nem a legjobb módszert alkalmaztam. Én úgy dolgoztam, hogy írtam egy programot, ami a következőt végzi:

Tároltam a már megkapott számokat, és minden számnak minden számmal való összegét.

Egy ciklussal végig mentem 1-900-ig a számokon.

Ha annak a számnak a már tárolt számokkal való összege szerepel az összeg tömbben, akkor nem tároltam le, de ha nem szerepelt, akkor letároltam a számot a megtalált számok tömbjében, és az addigi számokkal való összegét az összegeket tároló tömbben.

Ezeket a számokat találtam:

1. = 1

2. = 2

3. = 3

4. = 5

5. = 8

6. = 13

7. = 21

8. = 30

9. = 39

10. = 53

11. = 74

12. = 95

13. = 128

14. = 152

15. = 182

16. = 212

17. = 258

18. = 316

19. = 374

20. = 413

21. = 476

22. = 531

23. = 546

24. = 608

25. = 717

26. = 798

27. = 862

...

Lehet az, hogy nem az a legjobb megoldás, ha sorban mész a számokon.

2013. okt. 26. 01:14
Hasznos számodra ez a válasz?
 2/9 anonim ***** válasza:

Ja és itt a program. Lehet, hogy hibásan dolgozik, ezért kérlek nézd át.

include<iostream>

using namespace std;

int tomb[900 * 900];

int szamok[900];

int sz = 0;

int k = 0;

bool ellenorzes(int n)

{

for(int i = 0; i < k; ++i)

for(int j = 0; j < sz; ++j)

if(szamok[j] + n == tomb[i])

return false;

int valami = k;

for(int i = 0; i < sz; ++i)

tomb[k++] = szamok[i] + n;

szamok[sz++] = n;

return true;

}

int main()

{

int k = 0;

for(int i = 1; i <= 900; ++i)

ellenorzes(i);

for(int i = 0; i < sz; ++i)

cout <<i+1<< ". = "<< szamok[i] << " \n";

return 0;

}

2013. okt. 26. 01:16
Hasznos számodra ez a válasz?
 3/9 anonim ***** válasza:
Lehet, hogy több lenne, ha 2-3 számot kiszednénk belőle, és új számokat keresnénk.
2013. okt. 26. 02:17
Hasznos számodra ez a válasz?
 4/9 A kérdező kommentje:

Köszi!

Azt hiszem még egy visszalépés kellene: ha nem jó, akkor az/valamelyik előző számnál egy nagyobb jót keressen.

"int tomb[900 * 900];" - itt * helyett + van?

2013. okt. 26. 11:11
 5/9 A kérdező kommentje:

Vagy talán több "fix" fibonacci-számmal kellene indulni?

7. = 21

8. = 30 ->34

9. = 39 ->55

esetleg 10. = 53 ->89

2013. okt. 26. 11:16
 6/9 anonim ***** válasza:
Nem elég egy visszalépés. Akkor is 27 tagja lesz. Azt hiszem, hogy visszalépéses kereséssel meglehet oldani, de az elég hosszú.
2013. okt. 26. 11:21
Hasznos számodra ez a válasz?
 7/9 A kérdező kommentje:

Szerintem inkább szamok[30]; kellene, és az n. szám ciklusban szamok[n-1]+1 -től 900-ig

Ha n<30, szamok[n]=900 ->visszalépés

A tomb[1800] -ben(logikai) pedig ellenőrizni, hogy szamok[n]+szamok[n-1,n-2...] be van-e állítva.

Ha egyik sincs, akkor jó ->mindet beállítani, visszalépéskor ezeket törölni.

Valami ilyesmire gondolok.

2013. okt. 26. 12:11
 8/9 anonim ***** válasza:
Írd meg. Gondolom te is értesz valamit a programozáshoz.
2013. okt. 26. 13:06
Hasznos számodra ez a válasz?
 9/9 anonim ***** válasza:
Biztos meg lehet oldani okosabban is, az ilyen visszalépegetős cuccok, exponenciálissá teszik a futásidőt.
2013. nov. 13. 22:29
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!