动态规划应用(JAVA)

基本介绍

(1)核心思想:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法
(2)基本思想:将代求解问题分成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解
(3)与分治算法不同的是,适合用动态规划求解的问题,经分解得到子问题往往不是互相独立的(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,是进行进一步的解)
(4)动态规划可以通过填表的方式来逐步推出,得出最优解

利用动态规划解决01背包问题

  1. 代码实现:
/**
 * 动态规划解决背包问题
 */
public class DynamicPrograming {
    public static void main(String[] args) {
        int[] w={1,4,3};  //物品的重量
        int[] value={1500,3000,2000};  //物品相对应的价值
        int m=4;  //背包的容量
        int n= value.length; //物品的个数

        //创建二维数组
        //v[i][j]表示在前i个物品中能够装入容量为J的背包中的最大价值
        int[][] v=new int[n+1][m+1];
        //为了记录放入商品的情况,定一个二维数组
        int[][] path=new int[n+1][m+1];

        //初始化第一行和第一列,均为0
        for(int i=0;i<v.length;i++){
            v[i][0]=0;
        }
        for(int j=0;j<v[0].length;j++){
            v[0][j]=0;
        }

        //动态处理背包问题
        //i和j从1开始,是因为之前把第一行和第一列赋值为0
        for(int i=1;i<v.length;i++){
            for(int j=1;j<v[0].length;j++){
                if(j<w[i-1]) {
                    //如果背包的容量小于新加入的物品的重量
                    v[i][j] = v[i - 1][j];
                }else{
                    //如果背包的容量大于等于新加入的物品的重量
                    //v[i][j]=Math.max(v[i-1][j],value[i-1]+v[i-1][j-w[i-1]]);
                    if(v[i-1][j]<(value[i-1]+v[i-1][j-w[i-1]])){
                        v[i][j]=value[i-1]+v[i-1][j-w[i-1]];
                        //把当前情况记录到paht
                        path[i][j]=1;
                    }else{
                        v[i][j]=v[i-1][j];
                    }
                }
            }
        }

        //输出
        for(int i=0;i<v.length;i++){
            for(int j=0;j<v[0].length;j++){
                System.out.print(v[i][j]+"  ");
            }
            System.out.println();
        }

        //输出最后放入的是哪些产品
        int i=path.length-1;  //行的最大下标
        int j=path[0].length-1;  //列的最大下标
        while(i > 0 && j > 0 ){
            if(path[i][j]==1){
                System.out.printf("第%d个商品放入背包",i);
                j-=w[i-1];  //改变背包的剩余容量
            }
            i--;
        }
    }
}

实现结果:
0 0 0 0 0
0 1500 1500 1500 1500
0 1500 1500 1500 3000
0 1500 1500 2000 3500
第3个商品放入背包第1个商品放入背包

你可能感兴趣的:(数据结构)