[アルゴリズム]最小値がVの量以上である場合には(0-1ナップザック)

タイトル

0-1ナップザック問題の場合の最小値は、Vがある以上の要求されたボリュームをお願いします。

関連

伝達方程式は、初期化プロセスは、熟練した十分ではないと思われるのは簡単です、あなたはまた、より簡潔であるかもしれません。
一次元アレイを使用してDP。

コード

import java.util.Scanner;

public class Main{
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int V = sc.nextInt();
        int[] v = new int[n + 1];
        int[] w = new int[n + 1];
        int vSum = 0;
        for (int i = 1; i <= n; ++i) {
            v[i] = sc.nextInt();
            w[i] = sc.nextInt();
            vSum += v[i];
        }

        int[] dp = new int[V + 1];
        dp[0] = 0;
        for (int j = 1; j <= V; ++j) {
            dp[j] = Integer.MAX_VALUE;
        }
        for (int i = 1; i < n + 1; ++i) {
            for (int j = V; j >= v[i]; --j) {
                if (dp[j] == Integer.MAX_VALUE && dp[j - v[i]] == Integer.MAX_VALUE) {
                    dp[j] = Integer.MAX_VALUE;
                } else if (dp[j] == Integer.MAX_VALUE) {
                    dp[j] = dp[j - v[i]] + w[i];
                } else if (dp[j - v[i]] == Integer.MAX_VALUE) {
                    dp[j] = dp[j];
                } else {
                    dp[j] = Math.min(dp[j], dp[j - v[i]] + w[i]);
                }
            }
            for (int j = v[i] - 1; j >= 0; --j) {
                dp[j] = Math.min(dp[j], w[i]);
            }
        }

        System.out.println(dp[V]);
    }
}

おすすめ

転載: www.cnblogs.com/coding-gaga/p/12040295.html