0-1背包问题(动态规划法-DP含一维滚动数组优化)

0-1背包问题:
有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容量为W的背包。小偷要选择从这些物品中偷一部分物品放入该背包的方案,每个物品要么偷要么不偷,要求选中的物品不仅能够放到背包中,而且重量和为W具有最大的价值。

动态规划法采用递归实现,时间复杂度是0(nC) :


经典公式的推导.png

Java代码实现如下:

public class Main {

    public static void main(String[] args) {
        KnapSack knapSack = new KnapSack();
        int b[][] = knapSack.call();
        System.out.println(b[5][20]);

    }
}


class KnapSack{
    private static final int N = 5;//商品种类。包含第0个这个特殊值
    private static final int C = 20;//总可用容量
    private static final int w[]={2,3,4,5,9};  //每个商品容量
    private static final int v[]={3,4,5,8,10}; //每个商品价值

    public int[][] call(){
        //计算用
        int B[][] = new int[5][20];
        for(int n=1;n<5;n++){
            for(int c=1;c<20;c++){
                if(w[n] > c){
                    //无法偷
                    B[n][c] = B[n-1][c];
                }else{
                    //偷
                    int yesN = B[n-1][c-w[n]]+v[n];
                    //不偷
                    int noN = B[n-1][c];
                    B[n][c] = Math.max(yesN,noN);
                }
            }

        }
        return B;
    }

    //优化:由于B[i][j]是从前一个状态B[i-1][j]得到的,
    // 只与前一个状态有关,那么即可优化为一维滚动数组B[],
    public int[] call2(){
        //计算用
        int B[] = new int[C];
        for(int n=1;n<=N;n++){
            for(int c=C;c>=w[n];c--){
                int yesN = B[c-w[n]]+v[n];
                int noN = B[c];
                B[c] = Math.max(yesN,noN);
            }
        }
        return B;
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录 1.问题描述1.1 问题描述1.2 问题的数学表示(规划类问题,此种表示可以转换为回溯法)1.3 三种方法的...
    王侦阅读 19,851评论 0 2
  • 动态规划算法核心思想:1.刻画问题的最优解的结构特征2.递归定义最优解的值3.自底向上的方式计算最优解的值4.构造...
    迎风布阵x阅读 4,827评论 0 0
  • 0-1背包问题有n个重量分别为{w1,w2,…,wn}的物品,它们的价值分别为{v1,v2,…,vn},给定一个容...
    JaJIng阅读 4,803评论 0 0
  • 动态规划 递归 Python 问题描述:在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2……W...
    Asian_Road阅读 3,730评论 0 0
  • (姊妹篇) 人生本无趣,吾辈自乐人。 嗜酒只三杯,何必无由问? 忆当年,京城外,书生意气。 十日卜卦雀空啼, 背琴...
    宓公子阅读 3,188评论 0 3