Lintcode suma 89 K

Ki

título Descripción

Dada una matriz matriz de entrada (cada uno un número diferente), hay dos entero k y de destino, k elementos de la matriz para identificar la matriz, de tal manera que el k-ésimo elemento es igual a la diana suma, se le preguntó ¿Cuántas combinaciones, la salida el número de combinaciones.

NOTA: En una realización combinación, un elemento seleccionado no se puede repetir

Aquí para explicar la idea de usar la mochila 01, descendiendo el bucle interno

tema de análisis

Antes hablamos de dos Suma, también se menciona 3 Suma, así como 4 Suma, Esta pregunta es si esa solución se puede aplicar antes de que?

Aquí es un detalle que no sé si usted encuentra que la cabeza pregunta sólo para hacerle salida el número de todas las combinaciones, y no te permitirá a todas las combinaciones de salida, que es para decidir si el uso dinámico de programación punto muy importante.

K Sin esto, yo creo que será muy directamente pensar en solución usando problema de la mochila 01, entonces podemos pensar, basado en la solución original, si k aumenta este límite, necesitamos algo extra para hacerlo?

K debido a que el Estado va a decidir el asunto, así que tenemos que tener en cuenta el estado de la matriz K, teniendo en cuenta el k-ésimo elemento en la mochila, la mochila tenemos que tener en cuenta es almacenada k - 1 elementos del caso, por lo que parece de hecho, en comparación con el habitual problema de la mochila 01, Esta pregunta es sólo un aumento del estado unidimensional, sin ningún otro cambio.

Código de referencia

public int kSum(int[] array, int k, int target) {
    int[][] dp = new int[target + 1][k + 1];

    dp[0][0] = 1;

    for (int i = 0; i < array.length; ++i) {
        for (int j = target; j >= array[i]; --j) {
            // 和普通 01背包问题 相比,仅仅是多了一层状态需要考虑
            // 这层状态记录的是背包里面元素的个数
            // 我们放入第 r 个元素的时候,必须确保背包里面已经有 r - 1 个元素
            for (int r = 1; r <= k; ++r) {
                dp[j][r] += dp[j - array[i]][r - 1];
            }
        }
    }

    return dp[target][k];
}

 

for (int r = 1; r <= k; ++r) {
                dp[j][r] += dp[j - array[i]][r - 1];

Entender esta parte del código
puede poner dp de cada fila y como el número de la mochila problema general de la actualización original,

Supongo que te gusta

Origin www.cnblogs.com/islch/p/12602314.html
Recomendado
Clasificación