プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

フラクショナルナップサック問題


アイテムのリストが表示されます。各アイテムには独自の値と重みがあります。アイテムは、最大重量制限がWのナップザックに入れることができます。問題は、W以下の重量を見つけて、値を最大化することです。

ナップサック問題には2つのタイプがあります。

  • 0 –1ナップザック
  • フラクショナルナップザック

0〜1のナップザックの場合、アイテムを小さなピースに分割することはできません。また、フラクショナルナップザックの場合、アイテムを小さなピースに分割することもできます。

ここでは、分数ナップサック問題について説明します。

このアルゴリズムの時間計算量はO(n Log n)です。

入力と出力

Input:
Maximum weight = 50. List of items with value and weight.
{(60, 10), (100, 20), (120, 30)}
Output:
Maximum value: 240
By taking the items of weight 20 and 30

アルゴリズム

fractionalKnapsack(weight, itemList, n)

入力- ナップザックの最大重量、アイテムのリスト、アイテムの数

出力: 得られた最大値。

Begin
   sort the item list based on the ration of value and weight
   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
End

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

struct item {
   int value, weight;
};

bool cmp(struct item a, struct item b) {     //compare item a and item b based on the ration of value and weight
   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);      //sort item list using compare function
   int currWeight = 0;        // Current weight in knapsack
   double knapsackVal = 0.0;

   for (int i = 0; i < n; i++) {       //check through all items
      if (currWeight + itemList[i].weight <= weight) {     //when the space is enough for selected item, add it
         currWeight += itemList[i].weight;
         knapsackVal += itemList[i].value;

      }else{       //when no place for whole item, break it into smaller parts
         int remaining = weight - currWeight;
         knapsackVal += itemList[i].value * ((double) remaining / itemList[i].weight);
         break;
      }
   }
   return knapsackVal;
}

int main() {
   int weight = 50;     // Weight of knapsack
   item itemList[] = {{60, 10}, {100, 20}, {120, 30}};
   int n = 3;
   cout << "Maximum value: " << fractionalKnapsack(weight, itemList, n);
}

出力

Maximum value: 240

  1. 頂点被覆問題

    無向グラフの場合、頂点被覆は頂点のサブセットであり、グラフのすべてのエッジ(u、v)について、uまたはvのいずれかがセットに含まれます。 二分木を使用すると、頂点被覆問題を簡単に解決できます。 この問題は、2つのサブ問題に分けることができます。ルートが頂点被覆の一部である場合。この場合、ルートはすべての子エッジをカバーします。左右のサブツリーの頂点被覆のサイズを簡単に見つけて、ルートに1を追加できます。 入力と出力 Input: A binary tree. Output: The vertex cover is 3.   アルゴリズム vertexCover(root node

  2. 0-1ナップサック問題のためのPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 − n個のアイテムの重みと値が与えられているので、これらのアイテムを最大容量wまでの容量Wのバッグに入れる必要があります。最大数のアイテムを運び、その価値を返す必要があります。 次に、以下の実装のソリューションを見てみましょう- #ブルートフォースアプローチ 例 #Returns the maximum value that can be stored by the bag def knapSack(W, wt, val, n):    # initial conditions &n