Java 动态规划求解0-1背包问题

来源:互联网 发布:js 遍历子节点 编辑:程序博客网 时间:2024/05/29 06:36

       动态规划问题是自底向上地求解问题的解,总结利用前面已经计算好的结果。假设我们已经找到前i-1个物品,使得它的价值达到最大,剩下的背包容量为j,用一个数组来表示max[i][j]。现在放第i个物品,那么有两种选择,放还是不放呢?如果它的重量超过了背包剩下的容量,那么价值等于前i-1个物品的价值;放与不放,要取决于如果放下的价值大于不放的价值。

       直接看代码吧:

       public class Demo {   
        private static int capacity = 11;//背包容量  
        private static int num_items = 3;//物品数量  
  
       public static void main(String[] arg){  
        int[] weigth ={3,4,5};  
        int[] value ={4,5,6};  
  
        int[][] max = new int[num_items+1][capacity+1];  
        //initial array  
        for(int i=0;i<=num_items;i++){  
            for(int j=0;j<capacity;j++){  
                max[i][j]=0;  
            }  
        }  
        //  
        for(int i=1;i<=num_items;i++){  
            for(int j=1;j<=capacity;j++){  
                if(j<weigth[i-1]){  
                    //当前物品装不下时,背包最大价值还是等于原来  
                    max[i][j]=max[i-1][j];  
                }else{  
                    //是否装当前物品,取决于两者间的最大价值  
                    max[i][j]=Math.max(max[i-1][j-weigth[i-1]]+value[i-1], max[i-1][j]);  
                }  
            }  
        }  
        System.out.println("背包最大价值为: "+max[num_items][capacity]);  
    }  
}  

原创粉丝点击