动态规划算法经典案例----01背包问题实现

什么是动态规划

动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便

对于动态规划算法的代码实现 —本代码实现01背包

(一定要理解背包的容量是逐渐递增的以及下列公式)

如果当前的物品需要容量>当前容量 v[i][j]=v[i-1][j]; 如果当前的物品需要容量<=当前要容量 Max{v[i-1][j],value[i]+v[i-1][j-w[i]]}

下面是具体案例

  • 铅笔 1kg ¥100

  • 橡皮 2kg ¥200

  • 钢笔 3kg ¥400;

  • 一共4kg 求最多能拿多少价值 不能重复拿

public static void main(String[] args) {
        int [] w={1,2,3};//物品重量数组
        int [] value={100,200,400};//物品价值数组
        int m=3;//总物品数
        int n=4;//总容量
        int [][] v=new int[m+1][n+1];//表示当前能够得到的物品的和当前容量所组成的数组
        int [][] path=new int[m+1][n+1];//最后用于表示最大价值所装入的物品
        ByZero(v);
        toArray(v,w,value,path);
        out(v,path,w);

    }
    public static void ByZero(int [][]v){//将二维数组的第0行和第0列设为为0 就是没有物品或没有空间时价值都为0
        for (int i=0;i<v.length;i++){
            v[i][0]=0;//将第一列置为0

        }
        for (int j=0;j<v[0].length;j++){
            v[0][j]=0;//将第一行置为0
        }
    }
    //按照规律填充字符串
    /*
    * 如果当前的物品需要容量>当前容量   v[i][j]=v[i-1][j];
    * 如果当前的物品需要容量<=当前要容量 Max{v[i-1][j],value[i]+v[i-1][j-w[i]]}
    * */
    public static void toArray(int [][]v,int []w,int []value,int [][]path){
        for (int i=1;i<v.length;i++){
            for (int j=1;j<v[i].length;j++){
                if (j<w[i-1]){//因为物品重量数组从0开始
                    v[i][j]=v[i-1][j];
                }else {
                    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]];
                        path[i][j]=1;
                    }else {
                        v[i][j]=v[i-1][j];
                        path[i][j]=0;
                    }
                }
            }
        }
    }
    //输出当前最大价值组合的方法(注意是逆向输出否则有多组进入第二个方法)
    public static void out(int[][]v,int [][]path,int []w){
        int i=v.length-1;
        int j=v[0].length-1;
        while (i>0&&j>0){
            if (path[i][j]==1){
                System.out.println("放入第"+i+"个物品");
                j-=w[i-1];//求出剩余容量
            }
            i--;//往上一行求出剩余容量的最大价值
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_43237514/article/details/107801959