Defina [matemática] D [i, j, k] = verdadero [/ matemática] si existe alguna [matemática] A, B \ subconjunto \ {a_1, …, a_i \} [/ matemática] tal que [matemática] A \ cap B = \ conjunto vacío [/ matemática], [matemática] | A | = | B | + j [/ math] con [math] j \ geq 0 [/ math] y [math] \ sum_ {x \ in A} {x} = k + \ sum_ {y \ in B} {y} [/ math ], Requerimos que al menos uno de A y B no esté vacío. Tenga en cuenta que [math] k [/ math] puede ser positivo o negativo.
Entonces, una recurrencia que se puede utilizar para la programación dinámica es
[matemáticas] D [i, j, k] = D [i-1, j, k] \ lor [/ matemáticas]
[matemáticas] D [i-1, j-1, k – a_ {i}] \ lor [/ matemáticas]
[matemáticas] D [i-1, j + 1, k + a_ {i}] \ lor [/ matemáticas]
[matemáticas] (j = 1 \ tierra D [i-1,0, – (k-a_ {i})]) \ lor [/ matemáticas]
[matemáticas] (j = 1 \ tierra k = a_ {i}) [/ matemáticas]
Los casos aquí corresponden a (1) no usar [matemática] a_i [/ matemática], (2) agregar [matemática] a_i [/ matemática] a A, (3) agregar [matemática] a_i [/ matemática] a B, ( 4) agregar [math] a_i [/ math] a B para que se convierta en el conjunto más grande, o (5) establecer [math] A = {a_i} [/ math] y [math] B = \ emptyset [/ math] .
Por ejemplo, si D [8, 0, 4] es verdadero y [matemáticas] a_i = 5 [/ matemáticas], entonces D [9, 1, 9] también debe ser verdadero, y también lo es D [9, 1, 1] (No he implementado el código, solo lo he prototipado en papel, por lo que es posible que tenga un error de señal en alguna parte …)
- ¿Existe un algoritmo matemático para crear música agradable?
- ¿Puede haber una función generadora de números primos?
- ¿Qué algoritmo básico podría enseñarle a mi hijo de 12 años?
- Combinatoria: ¿Cuál es un método eficiente y sistemático para organizar 9 letras (A, B, C, D, E, F, G, H, I) en grupos de tres (ABC – AEF – IBD -DAC- …) en tal de manera que ninguna carta en particular comparte un grupo con otra letra en particular más de una vez?
- ¿Qué tan efectivo es resolver un problema al día?
Después de calcular los valores de recurrencia comenzando en [matemática] i = 1 [/ matemática] y concluyendo con [matemática] i = n [/ matemática], examine los valores verdaderos [matemática] D [n, 0, k] [/ matemática] y seleccione [math] k [/ math] con el valor absoluto más bajo. Esta es la solución al problema de optimización. Anotar cada D con un puntero “padre” (puede haber múltiples pero solo necesitamos uno) nos permitirá reconstruir los conjuntos A y B.
El tiempo de ejecución de este algoritmo no es particularmente bueno. Podemos vincular el valor absoluto de [math] k [/ math] a la mitad de la suma del conjunto, por lo que el tiempo de ejecución no debe ser peor que [math] O (n ^ {2} N) [/ math], y probablemente mejor en la práctica al usar hashes para almacenar [math] k [/ math] ‘s en lugar de una matriz.