[算法]体积不小于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