वस्तुओं की एक सूची दी गई है, प्रत्येक वस्तु का अपना मूल्य और वजन है। वस्तुओं को एक थैले में रखा जा सकता है जिसकी अधिकतम वजन सीमा डब्ल्यू है। समस्या यह है कि वजन डब्ल्यू से कम या उसके बराबर है, और मूल्य अधिकतम है।
Knapsack समस्या दो प्रकार की होती है।
- 0 - 1 बस्ता
- आंशिक थैला
0 - 1 नैपसेक के लिए, वस्तुओं को छोटे टुकड़ों में विभाजित नहीं किया जा सकता है, और भिन्नात्मक थैले के लिए, वस्तुओं को छोटे टुकड़ों में तोड़ा जा सकता है।
यहाँ हम भिन्नात्मक बस्ता समस्या पर चर्चा करेंगे।
इस एल्गोरिथम की समय जटिलता O(n Log n) है।
इनपुट और आउटपुट
इनपुट:अधिकतम वजन =50. मूल्य और वजन के साथ वस्तुओं की सूची।{(60, 10), (100, 20), (120, 30)}आउटपुट:अधिकतम मूल्य:240 वजन 20 की वस्तुओं को लेकर और 30
एल्गोरिदम
<पूर्व>आंशिक नॅप्सैक (वजन, आइटम सूची, एन)इनपुट - बैग का अधिकतम वजन, वस्तुओं की सूची और वस्तुओं की संख्या
आउटपुट: अधिकतम मूल्य प्राप्त किया।
मूल्य और वजन के राशन के आधार पर आइटम सूची को क्रमबद्ध करना शुरू करें वर्तमान वजन:=0 knapsackVal:=0 सूची में सभी वस्तुओं के लिए मैं करता हूं यदि वर्तमान वजन + आइटम का वजन [i] <वजन फिर वर्तमान वजन:=वर्तमान वजन + वजन आइटम का [i] knapsackVal :=knapsackVal + आइटम का मान [i] अन्य शेष :=वज़न - currentWeight knapsackVal "=knapsackVal + आइटम का मान [i] * (आइटम का शेष/वजन [i]) लूप को तोड़ना समाप्त हो गया है। /पूर्व>उदाहरण
#include#include<एल्गोरिदम> नेमस्पेस का उपयोग करना; स्ट्रक्चर आइटम {इंट वैल्यू, वेट;}; बूल सीएमपी (स्ट्रक्चर आइटम ए, स्ट्रक्चर आइटम बी) {//आइटम ए और आइटम बी की तुलना के आधार पर करें मूल्य और वजन का राशन दुगना अनुपात =(दोगुना)a.मूल्य / a.वजन; डबल बीराटियो =(डबल) बी.वैल्यू / बी.वेट; रिटर्न aRatio> bRatio;} डबल फ्रैक्शनल नॅप्सैक (इंट वेट, आइटम आइटम लिस्ट [], इंट एन) {सॉर्ट (आइटम लिस्ट, आइटमलिस्ट + एन, सीएमपी); // तुलना फ़ंक्शन का उपयोग करके आइटम सूची को सॉर्ट करें int currWeight =0; // knapsack डबल knapsackVal =0.0 में वर्तमान वजन; के लिए (int i =0; i आउटपुट
अधिकतम मान:240