Si los números [matemática] a_i [/ matemática] o [matemática] b_i [/ matemática] no son demasiado grandes ([matemática] <10 ^ 7 [/ matemática]), puedo pensar en una solución de programación dinámica que tenga memoria complejidad [matemática] K * v ^ 3 [/ matemática] y complejidad temporal [matemática] N * K * v ^ 2 [/ matemática] (Donde K mayúscula es el valor máximo de [matemática] a_i [/ matemática] o [matemática ] b_i [/ math], el que sea más pequeño).
El algoritmo es simple, crea una matriz A [i] [j] que almacena el valor máximo de la suma de b, suponiendo que ha usado i de las v columnas posibles y que la suma de a suma hasta j. La suma máxima es K * v, por lo que el tamaño es K * v ^ 2. Necesitará una matriz auxiliar que codifique qué columnas seleccionó para cada valor de la suma (Esto tendrá un tamaño K * v ^ 3. Luego iterará a través de cada columna de su matriz y actualizará A si incluir la nueva columna le da un suma mayor de b para una suma dada de a.