problém s batohem

zjistil jsem, že problém s batohem je zároveň složitý a zajímavý. Jsem si jistý, že pokud jste na návštěvě tuto stránku, budete již vědět, problém prohlášení, ale jen kvůli dokončení :

Problém:

Vzhledem k Batoh s maximální kapacitou W a N předmětů, každý s jeho vlastní hodnotu a váhu, házet předměty uvnitř Batohu tak, že konečný obsah má maximální hodnotu. Jejda !!,

Tady je obecný způsob, problém je vysvětlit – Zvážit zloděj dostane do domu, okrást a nosí batoh. V domácnosti je pevný počet položek-každý s vlastní hmotností a hodnotou – šperky, s menší hmotností a nejvyšší hodnotou vs tabulky, s menší hodnotou, ale hodně těžké. Chcete-li přidat palivo do ohně, zloděj má starý batoh, který má omezenou kapacitu. Je zřejmé, že nemůže rozdělit stůl na polovinu nebo šperky na 3/4ths., Buď to vezme, nebo listy,

Příklad :

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}

letmý pohled na příkladu dat nám říká, že max hodnota, že jsme se mohli ubytovat s limitem max. hmotnosti 10, 50 + 40 = 90 s hmotností 7.

přístup:

způsob, jakým je to optimálně řešeno, je použití dynamického programování-řešení pro menší sady problémů s batohem a jejich rozšíření pro větší problém.,

Pojďme vytvořit Položku x Hmotnost pole s názvem V (Hodnota, pole):

V = 4 rows * 10 columns

Každá z hodnot v této tabulce představují menší problém Batohu.

základní případ 1: vezměme případ 0. sloupce. To jen znamená,že batoh má kapacitu 0. Co v nich můžete držet? Nic. Takže je naplníme všemi 0s.

základní případ 2: vezměme případ 0 řádek. To jen znamená, že v domě nejsou žádné předměty. Co držíte v batohu, pokud nejsou žádné položky. Už nic !!! Všechny nuly.,

řešení:

1) nyní začneme vyplňovat řádek pole. Co znamená řádek 1 a sloupec 1? Vzhledem k první položce (řádku) ji můžete umístit do batohu s kapacitou 1 (sloupec). Ne. Hmotnost první položky je 5. Takže, pojďme vyplnit 0. Ve skutečnosti bychom nebyli schopni vyplnit nic, dokud nedosáhneme sloupce 5 (hmotnost 5).

2) jakmile dosáhneme sloupce 5 (což představuje hmotnost 5) v prvním řádku, znamená to, že bychom mohli umístit položku 1., Pojďme vyplnit v 10 tam (nezapomeňte, že toto je Hodnota, pole):

3) Pohybující se na, pro hmotnost, 6 (sloupec 6), můžeme ubytovat cokoliv jiného s zbývající hmotnost 1 (váha – váha této položky => 6 – 5). Hej, pamatuj, jsme na první položce. Takže je trochu intuitivní, že zbytek řádku bude mít stejnou hodnotu, protože nemůžeme přidat žádnou jinou položku pro tuto extra váhu, kterou máme.,

4) takže další zajímavá věc se stane, když se dostaneme do sloupce 4 ve třetím řádku. Aktuální provozní hmotnost je 4.

měli bychom zkontrolovat následující případy.

1) můžeme ubytovat položku 2-Ano, můžeme. Hmotnost položky 2 je 4.

2) je hodnota aktuální hmotnosti vyšší bez položky 2? – Zkontrolujte předchozí řádek pro stejnou hmotnost. Ne. předchozí řádek * má 0 v něm, protože jsme nebyli schopni pojmout položku 1 v hmotnosti 4.

3) můžeme pojmout dvě položky ve stejné hmotnosti, abychom mohli maximalizovat hodnotu? – Ne., Zbývající hmotnost po odečtení hmotnosti Item2 je 0.

proč předchozí řádek?

jednoduše proto, že předchozí řádek o hmotnosti 4 je menší řešení batohu, které dává maximální hodnotu, která by mohla být nahromaděna pro tuto hmotnost až do tohoto bodu (procházející položkami).,

Příkladem,

1) hodnota aktuální položky = 40

2) hmotnost aktuální položky = 4

3) váhu, která je vlevo nad = 4 – 4 = 0

4) Zkontrolujte, zda řádek výše (Položka výše v případě bodu 1 nebo kumulativní Max hodnotu v případě, že zbytek řádky). Pro zbývající hmotnost 0 jsme schopni pojmout položku 1? Jednoduše řečeno, existuje vůbec nějaká hodnota v řádku výše pro danou hmotnost?,

výpočet probíhá tak jako :

1) Vzít max. hodnota pro stejnou váhu bez této položky:

previous row, same weight = 0=> V

2) mít hodnotu aktuální položky + hodnota, že jsme se mohli ubytovat s zbývající hmotnost:

Max mezi nimi je 40 (0 až 40).

3) další a nejdůležitější událost se stane ve sloupci 9 a řádku 2. To znamená, že máme hmotnost 9 a máme dvě položky. Při pohledu na příklad dat bychom mohli ubytovat první dvě položky., Tady jsme v úvahu několik věcí:

  1. hodnota aktuální položky = 40
  2. hmotnost aktuální položky = 4
  3. hmotnost, která je vlevo nad = 9 – 4 = 5
  4. Podívejte se na řádku výše. Při zbývající hmotnosti 5, jsme schopni pojmout položku 1.

Takže výpočet je :

1) Vzít max. hodnota pro stejnou váhu bez této položky:

previous row, same weight = 10

2) mít hodnotu aktuální položky + hodnota, kterou bychom mohli hromadit zbývající hmotnost:

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

Na konci řešení všech těchto menších problémů, jen se musíme vrátit hodnotu na V – Položka 4 na Váhu 10:

Složitost

Analyzovat složitost řešení je docela rovně vpřed. Máme jen smyčku pro W ve smyčce N = > o (NW)

implementace:

zde přichází povinný implementační kód v Javě:

Articles

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *