The Knapsack Problem

Keling 8-bobdagi yukxalta muammosini qayta ko'rib chiqaylik.

The knapsack problem

Keling, 8-bobdagi yukxalta muammosini qayta ko'rib chiqaylik. Siz 4 funt yuk ko'tara oladigan yukxalta bilan o'g'risiz.

Sizda yukxalta ichiga qo'yishingiz mumkin bo'lgan uchta narsa bor.

Box image

Maksimal pul qiymatiga ega bo'lgan tovarlarni o'g'irlash uchun qanday narsalarni o'g'irlash kerak?

The simple solution

Eng oddiy algoritm bu: siz barcha mumkin bo'lgan tovarlar to'plamini sinab ko'rasiz va sizga eng ko'p qiymat beradigan to'plamni topasiz.

Box image

Bu ishlaydi, lekin u juda sekin. 3 ta element uchun siz 8 ta mumkin bo'lgan to'plamni hisoblashingiz kerak. 4 ta element uchun siz 16 ta to'plamni hisoblashingiz kerak. Siz qo'shgan har bir element bilan hisoblashingiz kerak bo'lgan to'plamlar soni ikki baravar ko'payadi! Bu algoritm O(2^n) vaqtni oladi, bu juda va juda sekin.

Box image

Bu har qanday o'rtacha miqdordagi tovarlar uchun amaliy emas. 8-bobda siz taxminiy yechimni qanday hisoblashni ko'rdingiz. Bu yechim optimal yechimga yaqin bo'ladi, lekin u optimal yechim bo'lmasligi mumkin. Xo'sh, optimal echimni qanday hisoblash mumkin?

Dynamic programming

Javob: Dinamik dasturlash bilan! Keling, bu erda dinamik dasturlash algoritmi qanday ishlashini ko'rib chiqaylik. Dinamik dasturlash kichik muammolarni hal qilishdan boshlanadi va katta muammolarni hal qilish uchun tuziladi. Yukxalta muammosi uchun siz kichikroq sumkalar (yoki "sub-saplar") muammosini hal qilishdan boshlaysiz va keyin asl muammoni hal qilishga harakat qilasiz.

Box image

Dinamik dasturlash - bu qiyin tushuncha, shuning uchun uni darhol qabul qilmasangiz, tashvishlanmang. Biz ko'plab misollarni ko'rib chiqamiz.

Avval sizga algoritmni amalda ko'rsatishdan boshlayman. Bir marta amalda ko'rganingizdan so'ng, sizda juda ko'p savollar bo'ladi! Men har bir savolga javob berishga harakat qilaman.

Har bir dinamik dasturlash algoritmi griddan boshlanadi. Mana yukxalta muammosi uchun panjara.

Box image

To'r satrlari elementlar, ustunlar esa 1 funtdan 4 funtgacha bo'lgan yukxalta og'irliklaridir. Sizga bu ustunlarning barchasi kerak, chunki ular pastki sumkalarning qiymatlarini hisoblashda yordam beradi. To'r bo'sh boshlanadi. Siz to'rning har bir katakchasini to'ldirasiz. To'r to'ldirilgandan so'ng, siz ushbu muammoga javob olasiz! Iltimos, kuzatib boring. O'zingizning katakchangizni yarating, biz uni birgalikda to'ldiramiz.

Gitara qatori

Men sizga ushbu to'rni hisoblashning aniq formulasini keyinroq ko'rsataman. Keling, avval ko'rib chiqaylik. Birinchi qatordan boshlang.

Box image

Bu gitara qatori, ya'ni siz gitarani yukxalta ichiga joylashtirishga harakat qilyapsiz. Har bir kamerada oddiy qaror bor: siz gitara o'g'irlaysizmi yoki yo'qmi? Esingizda bo'lsin, siz o'g'irlash uchun sizga eng katta qiymat beradigan narsalarni topishga harakat qilyapsiz.

Birinchi kamerada 1 funt sig'imli yukxalta bor. Gitara ham 1 funt, ya'ni u yukxalta ichiga sig'adi! Shunday qilib, bu katakning qiymati 1500 dollarni tashkil etadi va unda gitara bor.

Keling, katakchani to'ldirishni boshlaylik.

Box image

Shunga o'xshab, to'rdagi har bir katak o'sha nuqtada sumkaga mos keladigan barcha narsalar ro'yxatini o'z ichiga oladi.

Keling, keyingi katakchani ko'rib chiqaylik. Bu yerda sizda 2 funt sig'imli yukxalta bor. Xo'sh, gitara, albatta, u erga sig'adi!

Box image

Bu qatordagi qolgan hujayralar uchun ham xuddi shunday. Esingizda bo'lsin, bu birinchi qator, shuning uchun sizda faqat gitara tanlashingiz mumkin. Siz qolgan ikkita narsani hozir o'g'irlash mumkin emas deb o'ylaysiz.

Box image

Bu vaqtda, ehtimol siz chalkashib ketgansiz. Muammo 4 lb yukxalta haqida gap ketganda, nega buni 1 funt, 2 funt va hokazo sig'imli sumkalar uchun qilyapsiz? Dinamik dasturlash kichik muammodan boshlanib, katta muammoga olib keladi, deb aytganimni eslaysizmi? Siz bu yerda katta muammoni hal qilishga yordam beradigan kichik muammolarni hal qilyapsiz. O'qing va hamma narsa aniqroq bo'ladi.

Ushbu nuqtada sizning to'ringiz shunday ko'rinishi kerak.

Box image

Esingizda bo'lsin, siz yukxalta qiymatini maksimal darajada oshirishga harakat qilyapsiz. Bu qator shu maksimal uchun joriy eng yaxshi taxminni ifodalaydi. Shunday qilib, hozirda, ushbu qatorga ko'ra, agar sizda 4 funt sig'imli yukxalta bo'lsa, u erga qo'yishingiz mumkin bo'lgan maksimal qiymat 1500 dollarni tashkil qiladi.

Box image

Bilasizmi, bu yakuniy yechim emas. Algoritmni ko'rib chiqsak, siz o'z taxminingizni aniqlaysiz.

The stereo row

Keyingi qatorni bajaramiz. Bu stereo uchun. Endi siz ikkinchi qatordasiz, siz stereo yoki gitara o'g'irlashingiz mumkin. Har bir qatorda siz ushbu qatordagi yoki uning ustidagi qatorlardagi narsalarni o'g'irlashingiz mumkin. Shunday qilib, siz hozir noutbukni o'g'irlashni tanlay olmaysiz, lekin siz stereo va / yoki gitara o'g'irlashingiz mumkin. Birinchi katakchadan boshlaylik, sig'imi 1 funt bo'lgan yukxalta. Siz 1 funt yukxalta ichiga sig'dira oladigan joriy maksimal qiymat 1500 dollarni tashkil qiladi.

Box image

Stereoni o'g'irlash kerakmi yoki yo'qmi?

Sizda 1 funt sig'imli yukxalta bor. Stereo mos keladimi? Yo'q, bu juda og'ir! Stereo moslamani sig'dira olmaganingiz uchun 1 funtlik yukxalta uchun 1500 dollar maksimal taxmin bo'lib qoladi.

Box image

Keyingi ikkita hujayra uchun ham xuddi shunday. Bu sumkalar 2 funt va 3 funt sig'imga ega. Har ikkalasining eski maksimal qiymati 1500 dollar edi.

Box image

Stereo hali ham mos emas, shuning uchun sizning taxminlaringiz o'zgarishsiz qoladi. Agar sizda 4 funt sig'imli yukxalta bo'lsa-chi? Aha: stereo nihoyat mos keladi! Qadimgi maksimal qiymat 1500 dollar edi, lekin uning o'rniga stereoni qo'ysangiz, qiymat 3000 dollarni tashkil qiladi! Keling, stereoni olaylik.

Box image

Siz hozirgina taxminingizni yangiladingiz! Agar sizda 4 funtlik yukxalta bo'lsa, unga kamida 3000 dollarlik tovarlar sig'ishi mumkin. Toʻrdan siz oʻz taxminingizni bosqichma-bosqich yangilayotganingizni koʻrishingiz mumkin.

Box image

The laptop row

Keling, noutbuk bilan ham xuddi shunday qilaylik! Noutbukning og'irligi 3 funt, shuning uchun u 1 funt yoki 2 funt yukxalta ichiga sig'maydi. Dastlabki ikkita hujayraning taxminiy qiymati 1500 dollarni tashkil qiladi.

Box image

3 funt og'irlikda eski hisob 1500 dollar edi. Lekin uning o'rniga noutbukni tanlashingiz mumkin va bu 2000 dollarga teng. Shunday qilib, yangi maksimal taxmin $ 2,000!

Box image

4 funtda narsalar juda qiziq bo'ladi. Bu muhim qism. Hozirgi taxmin 3000 dollarni tashkil qiladi. Noutbukni yukxalta ichiga qo'yishingiz mumkin, lekin u atigi 2000 dollar turadi.

Box image

Hmm, bu eski taxmin kabi yaxshi emas. Lekin kuting! Noutbukning og'irligi atigi 3 funt, shuning uchun sizda 1 funt bepul! Siz bu 1 funtga biror narsa qo'yishingiz mumkin.

Box image

1 lb bo'sh joyga sig'adigan maksimal qiymat qancha? Xo'sh, siz hamma narsani hisoblab chiqdingiz.

Box image

Oxirgi eng yaxshi hisob-kitoblarga ko'ra, siz gitarani o'sha 1 funtlik joyga sig'dira olasiz va bu 1500 dollarga teng. Shunday qilib, haqiqiy taqqoslash quyidagicha.

Box image

Siz nima uchun kichikroq sumkalar uchun maksimal qiymatlarni hisoblayotganingiz haqida hayron bo'lgandirsiz. Umid qilamanki, endi bu mantiqiy! Agar sizda bo'sh joy qolgan bo'lsa, ushbu bo'shliqqa nima mos kelishini aniqlash uchun ushbu kichik muammolarga javoblardan foydalanishingiz mumkin. Noutbukni + gitarani 3500 dollarga olish yaxshidir.

Yakuniy panjara shunday ko'rinadi.

Box image

Javob bor: yukxalta ichiga sig'adigan maksimal qiymat gitara va noutbukdan tashkil topgan 3500 dollarni tashkil qiladi! Ehtimol, men o'sha oxirgi katakning qiymatini hisoblash uchun boshqa formuladan foydalangan deb o'ylaysiz. Buning sababi, men oldingi kataklarning qiymatlarini to'ldirishda keraksiz murakkablikni o'tkazib yubordim. Har bir hujayraning qiymati bir xil formula bilan hisoblanadi. Mana.

Box image

Siz ushbu formuladan ushbu to'rdagi har bir katak bilan foydalanishingiz mumkin va siz men qilgan to'rga ega bo'lishingiz kerak. Qanday qilib kichik muammolarni hal qilish haqida gapirganimni eslaysizmi? Kattaroq muammoni hal qilish uchun siz ikkita kichik muammoning echimlarini birlashtirdingiz.

Box image

Ushbu sahifada

Xato haqida xabar berish