Problema del algoritmo VB, encontrar un número específico de una pila de números
Este es un problema de suma de subconjuntos. Es un problema NP bien conocido en la teoría de algoritmos.
Existen varias soluciones clásicas:
1. Hay combinaciones de todos los elementos del conjunto, luego se suman y se comparan con el objetivo de suma. El método es simple, pero la complejidad del algoritmo es alta. Cuando el número de conjuntos es grande, como ≥ 15, la velocidad es obviamente lenta;
2. La solución recursiva es un esquema típico de divide y vencerás.
3. Retroceder, la subcolección es un caso especial de esto. -- Aunque también requiere recursividad, en comparación con el método anterior, puede mantener una buena eficiencia cuando la colección es relativamente grande.
El código VB para el método de retroceso se proporciona a continuación (VB 2010).
?Privado?Sub?salida(ByRef?ta()?As?Integer,?ByVal?ta_size?As?Integer)
Dim?ra(ta_size?-?1)?As?Integer?'differ ?de?c/c++
Array.Copy(ta,?ra,?ta_size)
Dim?converter?=?New?Converter(Of?Integer,?String)( Function(num)?num.ToString)
Dim?str?=?String.Join("+",?Array.ConvertAll(ra,?converter))
lbSubset. Items.Add(str) End?Sub
Privado?Sub?getSubsetSum(ByRef?sa()?As?Integer,?ByRef?ta()?As?Integer, ByVal?sa_size?As?Integer ,?ByVal?ta_size?As?Integer, ByVal?sum?As?Integer,?ByVal?cnt_node?As?Integer,?ByVal?target?As?Integer)
Dim?i?As?Integer
Si?objetivo?=?suma?Entonces
salida(ta,?ta_size)
Si?cnt_node?+?1?
getSubsetSum(sa,?ta,?sa_size,?ta_size?-?1 ,?sum?-?sa(cnt_node),?cnt_node?+?1,?target)
Fin?Si
Regresar
Else
Si?cnt_node?
¿Para?i?=?cnt_node?To?sa_size?-? 1?'?difieren?de?c/c++
ta(ta_size)?=?sa(i)
If?sum?+?sa(i)?<=? objetivo?Entonces
getSubsetSum(sa,?ta,?sa_size,?ta_size?+?1,?sum?+?sa(i),?i?+?1,?target)
¿Fin?Si
Siguiente?i
Fin?Si
Fin?Si
Fin?Sub
¿Privado?Sub?generarSubconjuntos(ByRef?sa()?As?Integer,?ByVal?size?As?Integer,?ByVal?target?As?Integer)
Dim?ta(tamaño ?-?1)?As?Integer
Dim?total?As?Integer?=?0
Array.Sort(sa)
total?= ?sa.Sum
Si?(sa(0)?<=?target)?Y?(total?>=?target)?Entonces
getSubsetSum(sa,?ta ,?tamaño,?0,?
0,?0,?objetivo)
Fin?Si
Fin?Sub Privado?Sub?btnStart_Click(remitente?As?System.Object,?e?As?System.EventArgs )?Handles?btnStart.Click
¿Dim?size?As?Integer?=?15
Dim?target?As?Integer?=?10
¿Dim?data()?As?Integer
Dim?i?As?Integer
lbSubset.Items.Clear()
ReDim?data(size? -?1)?'differ?from?c/c++
Para?i?=?LBound(data)?To?UBound(data)
data(i)?= ?i?+?1
¿Siguiente?i
generarSubconjuntos(datos,?tamaño,?objetivo)
Fin?Sub