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

posted on 2019-12-14 17:26  coding_gaga  阅读(383)  评论(0编辑  收藏  举报

导航