背包问题

作者: 稀饭粥95 | 来源:发表于2018-08-13 23:11 被阅读18次

01背包(物品只有一个)

有N件物品和一个容量为V的背包。第i建物品的费用是w[i],价值是v[i]。求解将哪些物品装入背包可使价值总和最大?每种物品只有一件,可以选择放或者不放

  • dp[i][v] = max{dp[i - 1][v - k * c[i]] + w[i],dp[i-1][v]}
public class Main {
    public int bag(int w[],int v[],int len, int volume) {
        int bag[] = new int[volume+1];
        for(int i=0;i<=volume;i++){
            bag[i] = 0;
        }
        for(int i=0;i<len;i++){
            for(int j=volume;j>=0;j--){
                int a,b=0;
                a=bag[j];
                if(w[i]<=j){
                    b = bag[j-w[i]]+v[i];
                }
                if(a<b) a=b;
                bag[j] =a;
            }
        }
        System.out.println(bag[volume]);
        return bag[volume];
    }
    
    public static void main(String[] args) {
        Main main = new Main();
        int w[] = new int[]{3,4,5};
        int v[] = new int[]{4,5,6};
        main.bag(w, v, w.length, 10);//11
    }
}

完全背包(物品有重复)

有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是w[i],价格是v[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大

  • 第一种解法dp[i][v] = max{dp[i-1][v - k * c[i]] + k * w[i] | 0 <= k * c[i]<= v}
  • 转化为01背包
public class Main {
    public int bag(int w[],int v[],int len, int volume) {
        int bag[] = new int[volume+1];
        for(int i=0;i<=volume;i++){
            bag[i] = 0;
        }
        for(int i=0;i<len;i++){
                //这里不一样
            for(int j=0;j<=volume;j++){
                int a,b=0;
                a=bag[j];
                if(w[i]<=j){
                    b = bag[j-w[i]]+v[i];
                }
                if(a<b) a=b;
                bag[j] =a;
            }
        }
        System.out.println(bag[volume]);
        return bag[volume];
    }
    
    public static void main(String[] args) {
        Main main = new Main();
        int w[] = new int[]{3,4,5};
        int v[] = new int[]{4,5,6};
        main.bag(w, v, w.length, 10);//13
    }
}

多重背包问题

有N种物品和一个容量为V的背包。第i种物品最多有n[i]件,每件费用是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大

  • dp[i][v] = max{dp[i - 1][v - k * c[i]] + w[i] | 0 <=k <= n[i]}
public class Main {
    public int bag(int w[],int v[],int n[] ,int len, int volume) {
        int bag[] = new int[volume+1];
        for(int i=0;i<=volume;i++){
            bag[i] = 0;
        }
        for(int i=0;i<len;i++){
            for(int j=volume;j>=0;j--){
                int max =0;//不一样了
                for(int k=0;k<=n[i];k++){//不一样了
                    int a,b=0;
                    a=bag[j];
                    if((j-k*w[i])>=0){//不一样了
                        b = bag[j-k*w[i]]+k*v[i];//不一样了
                    }
                    if(a<b) a=b;
                    if(a>max) max = a;//不一样了
                }
                bag[j] = max;//不一样了
            }
        }
        System.out.println(bag[volume]);
        return bag[volume];
    }
    
    public static void main(String[] args) {
        Main main = new Main();
        int w[] = new int[]{3,4,5};
        int v[] = new int[]{4,5,6};
        int n[] = new int[]{4,4,4};
        main.bag(w, v, n,w.length, 10);
    }
}

相关文章

  • 背包问题(完全背包)

    动态规划合集: 1.矩阵链乘法2.投资组合问题3.完全背包问题4.01背包问题5.最长公共子序列 例题3——背包问...

  • Algorithm进阶计划 -- 动态规划(下)

    经典动态规划背包问题最长子序列问题 1. 背包问题 1.1 0-1 背包问题 0-1 背包问题,描述如下: 上面...

  • 背包问题

    0-1背包问题 问题 n个物体,它们各自有重量和价值,给定一个有容量的背包,如何让背包里装入的物体价值总和最大? ...

  • 背包问题

    问题描述 假如有一个能装下4磅的背包,如何从下列商品列表中选择商品填充背包,使价值达到最大: 动态规划 要解决背包...

  • 背包问题

    (1)0-1背包容量为10的背包,有5种物品,每种物品只有一个,其重量分别为5,4,3,2,1,其价值分别为1,2...

  • 背包问题

  • 背包问题

    01背包(物品只有一个) 有N件物品和一个容量为V的背包。第i建物品的费用是w[i],价值是v[i]。求解将哪些物...

  • 背包问题

    1. 01背包 状态说明:背包体积为v,物品个数为n,f[n,v]表示前n件物品加入背包的最大价值。c_i,w_i...

  • 背包问题

    01背包 优化空间复杂度,变为一维; 外循环依然是n从1->N, 注意内循环 v是从V->0,为什么内循环是V->...

  • 背包问题

    介绍 学习动态规划算法的经典例题。动态规划算法一般有3个特征1、最优化原理:最优解所包含的子问题的解也是最优的。2...

网友评论

    本文标题:背包问题

    本文链接:https://www.haomeiwen.com/subject/khupbftx.html