Repun ongelma

löysin Repun ongelma on hankala ja mielenkiintoinen samaan aikaan. Olen varma, että jos olet vierailulla tämä sivu, tiedät jo, että ongelma lausunto, mutta vain sen vuoksi loppuun :

Ongelma:

Koska Selkäreppu, jonka tallennuskapasiteetti on enintään W-ja N-kohteita, joilla kullakin on oma arvo ja paino, heittää kohteita sisällä Selkäreppu sellainen, että lopullinen sisältö on suurin arvo. Jestas !!,

Tässä on yleinen tapa, että ongelma on selitetty – Pidä varas pääsee kotiin, ryöstää ja hän kantaa laukkunsa. On olemassa kiinteä määrä kohteita kotona – jokaisella on oma paino ja arvo – Korut, vähemmän painoa ja korkein arvo vs taulukot, joissa on vähemmän arvoa, mutta paljon raskas. Polttoaineen lisäämiseksi tulipaloon varkaalla on vanha reppu, jonka kapasiteetti on rajallinen. Hän ei tietenkään voi jakaa pöytää puoleen tai koruja 3 / 4thiin., Hän joko ottaa sen tai jättää sen

Esimerkki :

Knapsack Max weight : W = 10 (units)Total items : N = 4Values of items : v = {10, 40, 30, 50}Weight of items : w = {5, 4, 6, 3}

pintapuolisesti tarkastella esimerkiksi data kertoo meille, että max arvo, että voisimme majoittaa raja-max paino 10 on 50 + 40 = 90 paino 7.

Lähestymistapa:

tämä on optimaalisesti ratkaista käyttämällä dynaaminen ohjelmointi – ratkaiseminen pienempi sarjaa selkäreppu ongelmia, ja sitten laajentaa niitä isompi ongelma.,

katsotaanpa rakentaa Kohteen x Paino array nimeltään V (Arvo array):

V = 4 rows * 10 columns

Jokainen arvot tässä matriisi edustaa pienempi Selkäreppu ongelma.

perusasia 1 : otetaan tapaus 0.sarake. Se tarkoittaa vain sitä, että reppuun mahtuu 0. Mitä niissä on? Mitään. Joten, katsotaanpa täyttää ne kaikki 0s.

Base case 2 : otetaanpa tapauksessa 0-rivillä. Se vain tarkoittaa, että talossa ei ole tavaroita. Mitä pidät repussasi, jos tavaroita ei ole. Ei enää mitään !!! Kaikki nollat.,

Ratkaisu:

1) aloitetaan täyttämällä matriisin rivi-viisas. Mitä rivi 1 ja sarake 1 tarkoittavat? Että kun otetaan huomioon ensimmäinen kohde (rivi), voit majoittaa sen repun kapasiteetti 1 (sarake). Ei. Ensimmäisen kohteen paino on 5. Täytetään siis 0. Itse asiassa emme voisi täyttää mitään ennen kuin saavumme sarake 5 (paino 5).

2) Kun me sarakkeessa 5 (joka edustaa vähintään 5) ensimmäisellä rivillä, se tarkoittaa, että voisimme majoittaa kohta 1., Katsotaanpa täyttää 10 (muista, tämä on Arvo array):

3) eteenpäin, paino 6 (sarake 6), voimme majoittaa mitään muuta jäljellä paino 1 (paino – paino-tämä tuote => 6 – 5). Muista, että olemme ensimmäisessä jutussa. Niin, se on tavallaan intuitiivinen, että loput rivi on vain sama arvo liian, koska emme voi lisätä mitään muuta tuotetta, että ylimääräistä painoa, että olemme saaneet.,

4) Niin, että seuraava mielenkiintoinen asia tapahtuu, kun pääsemme 4 sarakkeen kolmannella rivillä. Nykyinen juoksupaino on 4.

meidän pitäisi tarkistaa seuraavat tapaukset.

1) Can we accommodate Item 2 – Yes, we can. Kohteen 2 paino on 4.

2) onko nykyisen painon arvo suurempi ilman kohdetta 2? – Tarkista edellisen rivin sama paino. Ei. edellinen rivi* on 0 siinä, koska emme pystyneet mahtuu Kohde 1 Paino 4.

3) voimmeko majoittaa kaksi saman painoista kohdetta, jotta voisimme maksimoida arvon? – En., Jäljelle jäävä paino Vähennettyään Item2: n painon on 0.

Miksi edellinen rivi?

Yksinkertaisesti koska edellisen rivin paino 4 itsessään on pienempi selkäreppu ratkaisu, joka antaa max-arvo, joka voisi olla kertynyt, että paino asti (kelkkaruuvinostolaitteet kautta kohteita).,

Esimerkein,

1) arvo nykyisen nimikkeen = 40

2) painon nykyinen kohde = 4

3) paino, joka on jäljellä yli = 4 – 4 = 0,

4) Tarkista rivin yläpuolella (Kohta edellä siinä tapauksessa, että Kohde 1 tai Max kumulatiivinen arvo siinä tapauksessa, loput rivit). Loput Paino 0, voimmeko mahtuu Kohde 1? Yksinkertaisesti sanottuna, onko mitään arvoa lainkaan rivi edellä annetun painon?,

laskelma menee näin :

1) Ota max-arvo sama paino ilman tätä erää:

previous row, same weight = 0=> V

2) Ota arvo nykyisen nimikkeen + arvo, että voisimme majoittaa jäljellä paino:

Max joukossa kaksi on 40 (0 ja 40).

3) Seuraava ja tärkein tapahtuma tapahtuu sarakkeessa 9 ja rivillä 2. Eli meillä on paino 9 ja meillä on kaksi kohdetta. Kun katsomme esimerkkitietoja, voisimme sijoittaa kaksi ensimmäistä kohdetta., Täällä me harkita muutamia asioita:

  1. arvo nykyisen nimikkeen = 40
  2. paino nykyinen kohde = 4
  3. paino on jäljellä yli = 9 – 4 = 5
  4. Tarkista rivin yläpuolella. Jäljellä paino 5, voimme majoittaa Kohde 1.

Näin on, laskeminen on :

1) Ota max-arvo sama paino ilman tätä erää:

previous row, same weight = 10

2) Ota arvo nykyisen nimikkeen + arvo, että voisimme kerääntyä jäljellä paino:

Value of current item (40)+ value in previous row with weight 5 (total weight until now (9) - weight of the current item (4))= 10

10 vs 50 = 50.,

lopussa ratkaisemaan kaikkia näitä pienempiä ongelmia, meidän täytyy vain tuotto value-at-V – 4 Kohta Paino 10:

Monimutkaisuus

Analysoimalla monimutkainen ratkaisu on melko suoraan eteenpäin. Meidän on silmukka W sisällä silmukka N => O (NW)

Toteutus:

Tässä tulee pakollinen täytäntöönpanoa koodi Java:

Articles

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *