Encuentre la suma máxima del subconjunto de longitud k de un conjunto dado, de modo que la suma sea estrictamente menor que M

He interpretado el problema como encontrar el subconjunto con k o menos elementos de peso máximo menor que M. Parte de lo que describo a continuación es un poco complicado si necesita exactamente k elementos.

Hay una reducción obvia del problema de suma de subconjuntos a este problema, por lo tanto, está claro que este problema es NP completo. Los tres algoritmos descritos en la página de Wikipedia son aplicables aquí.

Si N es pequeño y M es grande, puede usar la técnica de división y combinación para obtener un algoritmo [matemático] O (N 2 ^ {\ frac {N} {2}}) [/ matemático].

Si los elementos de su conjunto son todos enteros no negativos (o pueden transformarse para serlo) y NM tiene un tamaño manejable, puede usar una construcción de programación dinámica simple. Si [math] A_k [/ math] da el número mínimo de elementos necesarios para sumar a [math] k [/ math] (o infinito si es imposible), entonces podemos actualizar la matriz usando el elemento adicional [math] x [/ matemáticas] como:

[matemáticas] A’_k = min (A_k, 1 + A_ {kx}) [/ matemáticas]

Si ninguno de estos es cierto, es posible que deba recurrir a algoritmos de aproximación o búsqueda. El algoritmo de aproximación dado en la página Wiki, por ejemplo, puede permitirle encontrar la respuesta en tiempo polinómico siempre que la diferencia entre M y el tamaño máximo no sea una función insignificante.

Ordene la matriz dada A. Esto se puede hacer en [math] O (nlogn) [/ math] time usando Merge sort o Quicksort. Ahora ejecute la matriz ordenada (de nuevo se puede hacer en [math] O (n) [/ math]) y almacene el último índice [math] i_0 [/ math] para el cual A [[math] i_0 [/ math] ] Tenga en cuenta que el último paso debe optimizarse en la mayor medida posible.
Algunas optimizaciones son para detener el bucle en la etapa actual cuando la suma actual se vuelve mayor que M.

More Interesting

¿Cuál es la diferencia entre array estático y automático?

Si pudiera romper el algoritmo RSA, ¿lo mantendría en secreto?

En Python, dada la siguiente permutación de a, b, c, d, e, f, g, h, i, j, ¿cuál es la próxima permutación en el orden lexicográfico (diccionario)?

¿Qué bases de datos tienen implementaciones muy eficientes de estructuras de datos de índice R-Tree?

¿Es difícil implementar un árbol de radix? Si es así, ¿por qué?

¿Cómo se debe aprender la codificación, haciendo algoritmos, desde el nivel básico, dado que no tiene experiencia en codificación? (especialmente desde el punto de vista de la colocación y también dado el hecho de que me queda un año para que comience mi temporada de colocación).

Cómo analizar la complejidad temporal del algoritmo MST de prims

¿Cuál es el máximo común divisor de 55 y 75 usando el algoritmo euclidiano?

¿Cuáles son las ventajas de las pilas en la estructura de datos?

¿Qué haces si la resolución de un problema de algoritmo lleva demasiado tiempo?

¿Es seguro decir que un algoritmo iterativo es mejor que el recursivo para el mismo problema dado que ambos son de la misma complejidad temporal?

Sistemas distribuidos: ¿es posible utilizar el algoritmo de Paxos para generar números de secuencia (seqnums)?

¿Es cierto que no debería importarme tanto aprender lenguajes de programación sino construir una gran base de estructuras de datos y algoritmos?

¿Cómo determino la complejidad temporal de una expresión matemática que involucra potencias, divisiones y exponenciales? Sé la complejidad temporal de las operaciones simples, pero no sé cómo se supone que las combino para encontrar la respuesta.

En los primeros días de la informática, ¿por qué tenían que implementar memoria de núcleo de ferrita en lugar de utilizar conjuntos de condensadores?