O problema da mochila na estrutura e algoritmo de dados (32)

Demonstração diária das estruturas e algoritmos de dados de aprendizagem

Problema com mochila

Insira a descrição da imagem aqui

Introdução aos algoritmos de programação dinâmica

Insira a descrição da imagem aqui

Análise mental

Problemas semelhantes podem ser decomposto num número de pequena resolução de problemas, assumindo a presença da mochila está dividida em tamanho mochila vária capacidade 1,2,3,4 capacidade (regra de alocação de capacidade é um número inteiro múltiplo do peso mínimo):
Insira a descrição da imagem aqui
Para o primeiro Uma linha (i = 1), atualmente apenas guitarras podem ser selecionadas; portanto,
Insira a descrição da imagem aqui
para a segunda linha (i = 2), atualmente existem guitarras e aparelhos de som à sua escolha, portanto

Insira a descrição da imagem aqui
Para a terceira linha (i = 3), atualmente existem guitarras, aparelhos de som e computadores para você escolher, então
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Implementação de código

public class 背包问题 {
    public static void main(String args[]) {
        int w[] = {1, 4, 3};               // 保存物品重量
        int val[] = {1500, 3000, 2000};   // 物品的价值
        int capacity = 4;                 // 背包容量
        int n = val.length;               // 物品个数


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

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

        // 根据公式,算法.动态规划
        for (int i = 1; i < v.length; i++) {
            for (int j = 1; j < v[0].length; j++) {
                // 公式
                if (w[i - 1] > j) {
                    v[i][j] = v[i - 1][j];
                } else {
                    // 因为i从1开始
                    // 因此需要:w[i-1],val[i-1]
                    //v[i][j] = Math.max(v[i - 1][j], val[i - 1] + v[i - 1][j - w[i - 1]]);
                    // 为了记录商品存放到背包的情况,不能直接使用上述公式
                    if (v[i - 1][j] < val[i - 1] + v[i - 1][j - w[i - 1]]) {
                        v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
                        // 把当前情况记录到path
                        path[i][j] = 1;
                    } else {
                        v[i][j] = v[i - 1][j];
                    }
                }
            }
        }

        for (int[] ints : v) {
            for (int i : ints) {
                System.out.print(i + " ");
            }
            System.out.println();
        }
        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个商品放入背包\n", i);
                j -= w[i - 1];  // 指向前一个放到背包的商品,-1是因为i比w大1
            }
            i--;
        }
    }
}

Insira a descrição da imagem aqui

GitHub: estrutura de dados e código fonte do algoritmo

Publicado 83 artigos originais · Gosto 23 · Visite 3533

Acho que você gosta

Origin blog.csdn.net/qq_44779506/article/details/105275692
Recomendado
Clasificación