サーチ…


備考

ナップサック問題は、主にリソース割り当てメカニズムで発生します。 「ナップサック」という名前は、 トビアス・ダンツィヒによって最初に導入されました。

補助空間: O(nw)
時間複雑度 O(nw)

ナップザック問題の基礎

問題各項目に重みと値が含まれている項目のセットが与えられた場合、合計重量が所定の制限値以下で、合計値ができるだけ大きくなるようにコレクションに含める項目の数を決定する。

ナップザック問題の擬似コード

与えられた:

  1. 値(配列v)
  2. ウェイト(配列w)
  3. 個別項目数(n)
  4. 容量(W)
for j from 0 to W do:
    m[0, j] := 0
for i from 1 to n do:
    for j from 0 to W do:
        if w[i] > j then:
            m[i, j] := m[i-1, j]
        else:
            m[i, j] := max(m[i-1, j], m[i-1, j-w[i]] + v[i])

Pythonを使用した上記の擬似コードの簡単な実装:

def knapSack(W, wt, val, n):
    K = [[0 for x in range(W+1)] for x in range(n+1)]
    for i in range(n+1):
        for w in range(W+1):
            if i==0 or w==0:
                K[i][w] = 0
            elif wt[i-1] <= w:
                K[i][w] = max(val[i-1] + K[i-1][w-wt[i-1]],  K[i-1][w])
            else:
                K[i][w] = K[i-1][w]
    return K[n][W]
val = [60, 100, 120]
wt = [10, 20, 30]
W = 50
n = len(val)
print(knapSack(W, wt, val, n))

コードを実行する:これをknapSack.pyという名前のファイルに保存します。

$ python knapSack.py
220

上記のコードの時間複雑度: O(nW)ここで、nはアイテムの数であり、Wはナップザックの容量です。

C#で実装されたソリューション

public class KnapsackProblem
{
    private static int Knapsack(int w, int[] weight, int[] value, int n)
    {
        int i;
        int[,] k = new int[n + 1, w + 1];
        for (i = 0; i <= n; i++)
        {
            int b;
            for (b = 0; b <= w; b++)
            {
                if (i==0 || b==0)
                {
                    k[i, b] = 0;
                }
                else if (weight[i - 1] <= b)
                {
                    k[i, b] = Math.Max(value[i - 1] + k[i - 1, b - weight[i - 1]], k[i - 1, b]);
                }
                else
                {
                    k[i, b] = k[i - 1, b];
                }
            }
        }
        return k[n, w];
    }

    public static int Main(int nItems, int[] weights, int[] values)
    {
        int n = values.Length;
        return Knapsack(nItems, weights, values, n);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow