动态规划的两个经典问题

原文链接: https://my.oschina.net/happywe/blog/3059547

1. 0-1 背包问题

 // weight 原始物品数组,values 为其所对应的价值,n 表示物品的个数,w 表示背包所能承受的最大重量
  public void knapsack3(int [] weight, int [] values,int n, int w){
        // 每一行表示该物品装与不装的的价值
        int [][] states = new int[n][w + 1];
        for(int i = 0; i < n; i++){
            for(int j = 0; j < w + 1; j++){
                states[i][j] = -1;
            }
        }

        states[0][0] = 0;
        if(weight[0] < w){
            states[0][weight[0]] = values[0];
        }
       
        for(int i = 1; i < n; i++){
	// 不装该物品
            for(int j = 0; j <= w; j++){
                if(states[i - 1][j] >= 0){
                    states[i][j] = states[i - 1][j];
                }
            }
          //装该物品
            for(int j = 0; j <= w - weight[i]; j++){
                if(states[i - 1][j] > 0){
                    int v = states[i - 1][j] + values[i];
                    if(v > states[i][j + weight[i]]){
                        states[i][j + weight[i]] = v;
                    }
                }
            }
        }

        int maxValue = -1;
        for(int j = w; j >= 0; j--){
            if(states[n - 1][j] > maxValue){
                maxValue = states[n - 1][j];
            }
        }
        System.out.println(maxValue);

    }

2. 最小路径和

//martix 为原始数组,记录每个坐标内大小
 public int minDistDP(int [][] matrix,int n){
        int[][] states = new int[n][n];
	//初始化第 1 行的数据,并记录到 states 数组中
        int sum = 0;
        for(int i = 0; i < n; i++){
            sum += matrix[0][i];
            states[0][i] = sum;
        }
	// 初始化第一列的数据,并记录到 states 数组中
        sum = 0;
        for(int i = 0; i < n; i++){
            sum += matrix[i][0];
            states[i][0] = sum;
        }
        // 遍历 martix 里的数据,每次取上一步中较小的数存到 states 中
        for(int i = 1; i < n; i++){
            for(int j = 1; j < n; j++){
                states[i][j] = matrix[i][j] +
                        Math.min(states[i][j - 1],states[i - 1][j]);
            }
        }
        return states[n - 1][n - 1];
    }

转载于:https://my.oschina.net/happywe/blog/3059547

你可能感兴趣的:(动态规划的两个经典问题)