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

0/1 C / C ++で分枝限定法を使用するナップザック?


アイデアは、貪欲なアプローチがフラクショナルナップサック問題の最良の解決策を提供するという事実を実装することです。

特定のノードがより良いソリューションを提供できるかどうかを確認するために、貪欲アプローチを実装する最適なソリューションを(ノードを介して)計算します。欲張り法自体によって計算された解がこれまでのところ最良以上である場合、ノードを介してより良い解を得ることができません。

完全なアルゴリズムを以下に示します-

  • 貪欲アプローチを実装して上限を計算できるように、すべてのアイテムを単位重量あたりの値の比率の降順で並べ替えます。

  • maxProfit =0

    などの最大利益を初期化します
  • 空のキューQが作成されます。

  • デシジョンツリーのダミーノードが作成され、Qに挿入またはエンキューされます。ダミーノードの利益と重みは0です。

  • Qが空または空でないときにフォローしてください。

    • Qのアイテムが作成されます。抽出したアイテムをuとします。

    • 次のレベルのノードの利益を計算します。利益がmaxProfitよりも高い場合は、maxProfitを変更します。

    • 次のレベルのノードの境界を計算します。境界がmaxProfitよりも高い場合は、次のレベルのノードをQに追加します。

    • 次のレベルのノードがソリューションの一部として扱われない、または考慮されない場合を考えて、次のレベルのノードをキューに追加しますが、次のレベルのノードを処理または考慮せずに重みと利益を上げます。

以下のイラスト-

入力

// First thing in every pair is treated as weight of item
// and second thing is treated as value of item
Item arr1[] = {{2, 40}, {3.14, 50}, {1.98, 100}, {5, 95}, {3, 30}};
Knapsack Capacity W1 = 10

出力

The maximum possible profit = 235

  1. C++で級数1+1/2 + 1/3 + 1/4 + .. + 1/nの合計を求めるプログラム

    この問題では、数nが与えられます。私たちのタスクは、シリーズ1 + 1/2 + 1/3 + 1/4 + .. + 1/nの合計をC++で見つけるプログラムを作成することです 。 コードの説明 −ここでは、n番目の項までの級数1 + 1/2 + 1/3 + 1/4 + .. + 1/nの合計を求めます。このシリーズは調和数列シリーズです。 調和数列 は、その逆数が等差数列になる級数です。つまり調和数列A1、A2、A3 ... Anの場合、等差数列1 / A1、1 / A2、1/A3があります。 まず、問題を理解するために例を見てみましょう。 入力 n = 5 出力 2.59286 説明

  2. C++で0/1ナップザックでアイテムを印刷する

    n個のアイテムの重みと値を指定します。タスクは、容量Wのナップザックに次の重みと値の0/1ナップザックに従ってアイテムを印刷し、ナップザックの最大合計値を取得することです。 0/1ナップザックとは何ですか? ナップザックは、固定サイズの鞄や、ある程度の重さを扱える鞄のようなものです。ナップザックに含まれる各アイテムには、ある程度の価値(利益)と重みがあります。ナップザックが保持できる総重量に応じて最大の利益が得られる重量を追加する必要があります。 つまり、ナップザックが保持できるバッグの重量、値(利益)、および総重量があるので、0/1ナップザックでは、含まれるアイテムに1と0を指定し