zoukankan      html  css  js  c++  java
  • [算法]体积不小于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]);
    	}
    }
    
  • 相关阅读:
    Kubernetes 命令行工具之kubctl
    新一代数据库之Etcd 简介
    算法题 打家劫舍(动态规划)
    算法题 位1的个数
    Class强制类型转换
    算法题 阶乘后的零
    算法题 Excel表列序号
    多数元素
    有序数组两数之和
    一杯果汁和一杯水的故事
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/12040295.html
Copyright © 2011-2022 走看看