Vesken problem

jeg fant Vesken problemet vanskelig og interessant på samme tid. Jeg er sikker på at hvis du besøker denne siden, kan du allerede kjenner problemet uttalelse, men bare for moro skyld ferdigstillelse :

Problemet:

Gitt en Ryggsekk med en maksimal kapasitet på B og N elementer, hver med sin egen verdi og vekt, kast i elementer inne i Vesken slik at det endelige innholdet har den høyeste verdien. Yikes !!,

Her er de generelle måten problemet er forklart – Vurdere en tyv kommer inn i et hjem å rane og han bærer en ryggsekk. Det er fast antall elementer i hjem – hver med sin egen vekt og verdi – Smykker, med mindre vekt og høyeste verdi vs tabeller, med mindre verdi, men mye tung. For å legge bensin på bålet, tyven har en gammel ryggsekk som har begrenset kapasitet. Åpenbart, han kan ikke dele bord i halvparten eller smykker til 3/4ths., Han enten tar det eller forlater det

Eksempel :

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}

En overfladisk se på eksemplet data forteller oss at maks verdi at vi kan betjene med grense på maks vekt 10 50 + 40 = 90 med en vekt på 7.

Fremgangsmåte:

dette er optimalt er løst ved hjelp av dynamisk programmering – løse for mindre sett med niste problemer og deretter utvide dem for større problem.,

La oss bygge et Element x Vekt array kalt V (Verdi utvalg):

V = 4 rows * 10 columns

Hver av verdiene i denne matrisen representerer en mindre Ryggsekk problem.

Base case 1 : La oss ta tilfelle av 0th kolonne. Det betyr bare at vesken har 0 kapasitet. Hva kan du tak i dem? Ingenting. Så, la oss fylle dem opp alle med 0s.

Base case 2 : La oss ta tilfelle av 0 rad. Det betyr bare at det er ingen elementer i huset. Hva gjør du inne i vesken hvis det er ingen elementer. Ingenting igjen !!! Alle nuller.,

Løsning:

1) la oss Nå begynne å fylle i tabellen rad-messig. Hva betyr rad 1 og kolonne 1 betyr? At gitt det første elementet (rad), kan du plass til det i skreppen med kapasitet 1 (kolonne). Nope. Vekten av det første elementet er 5. Så, la oss fylle i 0. Faktisk, ville vi ikke være i stand til å fylle på noe som helst før vi nå kolonne 5 (vekt 5).

2) Når vi nå kolonne 5 (som representerer vekt 5) på første rad, det betyr at vi kan imøtekomme punkt 1., La oss fylle i 10 det (husk at dette er en Verdi utvalg):

3) Flytte på, for vekt 6 (kolonne 6), kan vi imøtekomme noe annet med den resterende vekten av 1 (vekt – vekt av dette elementet => 6 – 5). Hei, husk, vi er på det første elementet. Så, det er en slags intuitiv at resten av raden vil bare være den samme verdien for siden vi ikke er i stand til å legge til, i et annet element for den ekstra vekten som vi har fått.,

4) Så, neste interessante ting som skjer når vi nå kolonne 4 i tredje rad. Dagens kjører vekt er 4.

Vi bør se etter følgende tilfeller.

1) Kan vi plass til Punkt 2 – Ja, det kan vi. Punkt 2 er vekten er 4.

2) Er verdien for den nåværende vekt er høyere uten Punkt 2? – Sjekk den forrige rad for samme vekt. Nope. forrige rad,* har 0 i det, siden vi ikke var i stand stand plass til Punkt 1 i vekt 4.

3) Kan vi få plass til to elementer i samme vekt, slik at vi kan maksimere verdi? – Nope., Den resterende vekten etter at man har trukket fra Item2 vekt er 0.

Hvorfor forrige rad?

rett og Slett fordi den forrige rad i vekt 4 i seg selv er en mindre ryggsekk løsning som gir den maksimale verdien som kan være samlet for at vekten til det punktet (krysser gjennom elementene).,

Eksemplifisere,

1) verdien av det aktuelle elementet = 40

2) vekten av det aktuelle elementet = 4

3) Den vekt som er igjen over = 4 – 4 = 0

4) Sjekk raden ovenfor (Elementet ovenfor i tilfelle av Punkt 1 eller den kumulative Maks-verdien i tilfelle av resten av rader). For de resterende vekt 0, er vi i stand til å imøtekomme Punkt 1? Enkelt sagt, er det noen verdi i det hele tatt i raden ovenfor for gitt i vekt?,

beregningen går som så :

1) Ta maks verdi for samme vekt uten dette elementet:

previous row, same weight = 0=> V

2) Ta med verdien av det aktuelle elementet + verdi at vi kan imøtekomme de resterende vekt:

Maks blant de to er 40 (0 og 40).

3) Den neste og den viktigste begivenheten skjer i kolonne 9 og rad 2. Som betyr at vi har en vekt på 9, og vi har to elementer. Se på eksempelet data vi kunne romme de to første elementene., Her ser vi noen ting:

  1. verdien av det aktuelle elementet = 40
  2. vekt av det aktuelle elementet = 4
  3. vekt som er igjen = 9 – 4 = 5
  4. Sjekk raden ovenfor. På de øvrige vekt 5, er vi i stand til å imøtekomme Punkt 1.

Så, beregningen er :

1) Ta maks verdi for samme vekt uten dette elementet:

previous row, same weight = 10

2) Ta med verdien av det aktuelle elementet + verdi at vi kunne samle de resterende vekt:

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.,

På slutten av løse alle disse mindre problemer, vi trenger bare å returnere verdien på V – Sak 4 på Vekt 10:

Kompleksitet

å Analysere kompleksiteten av løsningen er ganske rett-fram. Vi har bare en sløyfe for W i en loop av N => O (NW)

Gjennomføring:

Her kommer den obligatoriske gjennomføringen koden i Java:

Articles

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *