• lintcode:背包问题II


    背包问题II

    给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大?

     注意事项

    A[i], V[i], n, m均为整数。你不能将物品进行切分。你所挑选的物品总体积需要小于等于给定的m。

    样例

    对于物品体积[2, 3, 5, 7]和对应的价值[1, 5, 2, 4], 假设背包大小为10的话,最大能够装入的价值为9。

    解题

    动态规划,和上一题很类似的

    状态转移方程:

    f[i][j]表示前i个商品在j的空间时候能够获得最大的价值

    状态转移方程:

    不放第i个商品

    f[i][j] = f[i-1][j]

    放第i个商品

    f[i][j] = f[i-1][j-A[i]]+V[i]

    public class Solution {
        /**
         * @param m: An integer m denotes the size of a backpack
         * @param A & V: Given n items with size A[i] and value V[i]
         * @return: The maximum value
         */
        public int backPackII(int m, int[] A, int V[]) {
            // write your code here
            int[][] P = new int[A.length+1][m+1];
            for(int i=1;i<=A.length;i++){
                for(int j=m;j>=0;j--){
                    if(j>=A[i-1])
                        P[i][j] = P[i-1][j-A[i-1]] + V[i-1];// 放第 i-1个物品,i-1最小值是0开始
                    P[i][j] = Math.max(P[i][j],P[i-1][j]);// 不放
                }
            }
            return P[A.length][m];
        }
    }

    改成一维数组

    public class Solution {
        /**
         * @param m: An integer m denotes the size of a backpack
         * @param A & V: Given n items with size A[i] and value V[i]
         * @return: The maximum value
         */
        public int backPackII(int m, int[] A, int V[]) {
            // write your code here
            int[] P = new int[m+1];
            for(int i=1;i<=A.length;i++){
                for(int j=m;j>=0;j--){
                    if(j>=A[i-1])
                        P[j] =  Math.max(P[j],P[j-A[i-1]] + V[i-1]);
                }
            }
            return P[m];
        }
    }
  • 相关阅读:
    css: 组合选择器
    css: 基础选择器
    javascript设计模式:工厂模式
    wx: 小程序公共机制
    vue: 脚手架创建项目
    nodejs: express sequelize-cli
    css:flex和float margin布局
    自定义标签之inclusion_tag
    Django模型之Meta选项详解
    Django内置Admin
  • 原文地址:https://www.cnblogs.com/theskulls/p/5487105.html
Copyright © 2020-2023  润新知