El problema es la APN, pero hay un algoritmo polinómico seudo por ello, este es un problema 2-Partition, puede seguir el camino de algoritmo de tiempo polinomial seudo para sub set sum problema a resolver esto. Si el tamaño de entrada se relaciona polinomialmente con los valores de entrada, esto se puede hacer en tiempo polinomial.
En su caso (pesos < 250) es polinomio (porque peso < = 250 n => sumas < = 250 n^2).
Vamos Sum = suma de pesos, tenemos que crear dos dimensiones matriz A, entonces construir A, columna por columna
A [i, j] = TRUE si (j == peso [i] o j - peso [i] = peso [k] (k está en la lista)).
La creación de matriz con este algoritmo toma O (n^2 * suma/2).
Por fin deberíamos encontrar la columna más valiosa que tiene verdadero valor.
Aquí es un ejemplo:
artículos: {0,1,2,3} pesos: {4,7,2,8} => suma = 21 suma/2 = 10
items/weights 0| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
---------------------------------------------------------
|0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0
|1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0
|2 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1
|3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1
Así pues a [10, 2] == true la partición es de 10, 11
Este es un algoritmo que encontré here y editado un poco para resolver su problema:
bool partition(vector<int> C) {
// compute the total sum
int n = C.size();
int N = 0;
for(int i = 0; i < n; i++) N += C[i];
// initialize the table
T[0] = true;
for(int i = 1; i <= N; i++) T[i] = false;
// process the numbers one by one
for(int i = 0; i < n; i++)
for(int j = N - C[i]; j >= 0; j--)
if(T[j]) T[j + C[i]] = true;
for(int i = N/2;i>=0;i--)
if (T[i])
return i;
return 0;
}
Acabo de devolver primero T [i] que es verdadero en lugar de devolver T [N/2] (en orden máximo a mínimo).
Encontrar el camino que da este valor no es difícil.
Muestra lo que tienes para que otros puedan comentar dónde saliste. –
ok Ahora estoy editando. Sin embargo, estoy buscando algoritmo diferente y correcto –
¿Has visto http://stackoverflow.com/questions/890171/algorithm-to-divide-a-list-of-numbers-int-2-equal-sum-lists ? – Michael