数据结构与算法 -- 动态规划算法

1、0-1背包问题

//0-1背包问题--动态规划算法
public class DynamicPlan {

    public static void main(String[] args) {
        DynamicPlan dynamicplan = new DynamicPlan();
        int[] weight = {1, 2, 3, 4, 5};
        System.out.println("方法一     背包所装物品的重量为:" + dynamicplan.knapsack(weight, weight.length, 12));
        System.out.println("方法二     背包所装物品的重量为:" + dynamicplan.knapsack2(weight, weight.length, 12));
    }

    //方法一      weight:物品重量,n:物品个数,w:背包可承载重量
    public int knapsack(int[] weight, int n, int w) {
        boolean[][] states = new boolean[n][w+1];//默认值false
        states[0][0] = true;//第一行的数据要特殊处理,可以利用哨兵优化
        if(weight[0] <= w) {
            states[0][weight[0]] = true;
        }
        for(int i=1; i<n; i++) {//动态规划状态转移
            for(int j=0; j<=w; j++) {//不把第i个物品放入背包
                if(states[i-1][j] == true) {
                    states[i][j] = states[i-1][j];
                }
            }
            for(int j=0; j<=w-weight[i]; j++) {//把第i个物品放入背包
                if(states[i-1][j] == true) {
                    states[i][j+weight[i]] = true;
                }
            }
        }
        for(int i=w; i>=0; i--) {//输出结果
            if(states[n-1][i] == true) {
                return i;
            }
        }
        return 0;
    }
    
    //方法二      weight:物品重量,n:物品个数,w:背包可承载重量
    public int knapsack2(int[] weight, int n, int w) {
        boolean[] states = new boolean[w+1];//默认值false
        states[0] = true;//第一行的数据要特殊处理,可以利用哨兵优化
        if(weight[0] <= w) {
            states[weight[0]] = true;
        }
        for(int i=1; i<n; i++) {//动态规划状态转移
            for(int j=w-weight[i]; j>=0; j--) {//把第i个物品放入背包
                if(states[j] == true) {
                    states[j+weight[i]] = true;
                }
            }
        }
        for(int i=w; i>=0; i--) {//输出结果
            if(states[i] == true) {
                return i;
            }
        }
        return 0;
    }
}

 2、0-1背包问题【升级版】

猜你喜欢

转载自www.cnblogs.com/jiangwangxiang/p/11072573.html