Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> प्रोग्रामिंग

फ्रैक्शनल नैपसैक प्रॉब्लम

आइटम्स की एक लिस्ट दी गई है, प्रत्येक आइटम का अपना वैल्यू और वजन है। आइटम्स को एक नैपसैक में रखा जा सकता है जिसकी अधिकतम वजन सीमा W है। समस्या यह है कि ऐसा वजन ढूंढें जो W से कम या बराबर हो, और वैल्यू अधिकतम हो।

नैपसैक प्रॉब्लम के दो प्रकार हैं।

  • 0 – 1 नैपसैक
  • फ्रैक्शनल नैपसैक

0 – 1 नैपसैक के लिए, आइटम्स को छोटे टुकड़ों में विभाजित नहीं किया जा सकता, और फ्रैक्शनल नैपसैक के लिए, आइटम्स को छोटे टुकड़ों में तोड़ा जा सकता है।

यहां हम फ्रैक्शनल नैपसैक प्रॉब्लम पर चर्चा करेंगे।

इस एल्गोरिदम की टाइम कॉम्प्लेक्सिटी O(n Log n) है।

इनपुट और आउटपुट

इनपुट: अधिकतम वजन = 50। वैल्यू और वजन के साथ आइटम्स की लिस्ट।
{(60, 10), (100, 20), (120, 30)}
आउटपुट: अधिकतम वैल्यू: 240
वजन 20 और 30 के आइटम्स लेकर

एल्गोरिदम

fractionalKnapsack(weight, itemList, n)

इनपुट: नैपसैक का अधिकतम वजन, आइटम्स की लिस्ट और आइटम्स की संख्या
आउटपुट: प्राप्त अधिकतम वैल्यू।

Begin
    वैल्यू और वजन के अनुपात के आधार पर आइटम लिस्ट को सॉर्ट करें
    currentWeight := 0
    knapsackVal := 0
    for all items i in the list do
        if currentWeight + weight of item[i] < weight then
            currentWeight := currentWeight + weight of item[i]
            knapsackVal := knapsackVal + value of item[i]
        else
            remaining := weight - currentWeight
            knapsackVal = knapsackVal + value of item[i] * (remaining / weight of item[i])
            break the loop
        done
    done
End

उदाहरण

#include <iostream>
#include <algorithm>
using namespace std;

struct item {
    int value, weight;
};

bool cmp(struct item a, struct item b) {
    // आइटम a और आइटम b की तुलना वैल्यू और वजन के अनुपात के आधार पर करें
    double aRatio = (double)a.value / a.weight;
    double bRatio = (double)b.value / b.weight;
    return aRatio > bRatio;
}

double fractionalKnapsack(int weight, item itemList[], int n) {
    sort(itemList, itemList + n, cmp); // तुलना फंक्शन का उपयोग करके आइटम लिस्ट सॉर्ट करें
    int currWeight = 0; // नैपसैक में वर्तमान वजन
    double knapsackVal = 0.0;
    for (int i = 0; i < n; i++) {
        // सभी आइटम्स के माध्यम से चेक करें
        if (currWeight + itemList[i].weight <= weight) {
            // जब चयनित आइटम के लिए पर्याप्त जगह हो, तो इसे जोड़ें
            currWeight += itemList[i].weight;
            knapsackVal += itemList[i].value;
        } else {
            // जब पूरे आइटम के लिए जगह न हो, तो इसे छोटे भागों में तोड़ें
            int remaining = weight - currWeight;
            knapsackVal += itemList[i].value * ((double) remaining / itemList[i].weight);
            break;
        }
    }
    return knapsackVal;
}

int main() {
    int weight = 50; // नैपसैक का वजन
    item itemList[] = {{60, 10}, {100, 20}, {120, 30}};
    int n = 3;
    cout << "अधिकतम वैल्यू: " << fractionalKnapsack(weight, itemList, n);
}

आउटपुट

अधिकतम वैल्यू: 240

  1. M-कलरिंग समस्या M-कलरिंग समस्या

    इस समस्या में, एक अनडायरेक्टेड ग्राफ दिया गया है। m रंग भी प्रदान किए गए हैं। समस्या यह ढूंढना है कि क्या नोड्स को m अलग-अलग रंगों के साथ असाइन करना संभव है, जैसे कि ग्राफ के कोई दो आसन्न वर्टेक्स एक ही रंग के न हों। यदि समाधान मौजूद है, तो प्रदर्शित करें कि कौन सा रंग किस वर्टेक्स पर असाइन किया गय

  1. वर्टेक्स कवर समस्या वर्टेक्स कवर समस्या

    एक अनडायरेक्टेड ग्राफ के लिए, वर्टेक्स कवर वर्टेक्स का एक सबसेट है, जहां ग्राफ के प्रत्येक एज (u, v) के लिए या तो u या v सेट में होता है। बाइनरी ट्री का उपयोग करके, हम वर्टेक्स कवर समस्या को आसानी से हल कर सकते हैं। इस समस्या को दो सब-प्रॉब्लम्स में विभाजित किया जा सकता है। जब रूट वर्टेक्स कवर का

  1. पायथन प्रोग्राम: 0-1 नैपसैक समस्या पायथन प्रोग्राम: 0-1 नैपसैक समस्या

    इस लेख में हम दी गई समस्या के समाधान के बारे में जानेंगे। समस्या कथन हमें n वस्तुओं के वजन और मूल्य दिए गए हैं, हमें इन वस्तुओं को क्षमता W के बैग में अधिकतम क्षमता w तक रखना है। हमें अधिकतम वस्तुओं को ले जाने की आवश्यकता है और उसका मूल्य वापस करना है। उदाहरण (साधारण दृष्टिकोण) W): return k