Red de conocimiento del abogados - Preguntas y respuestas jurídicas - Problema del algoritmo VB, encontrar un número específico de una pila de números

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 ?from?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?lt; suma?-?sa(cnt_node)? ?sa(cnt_node? ?1)?lt;=?target?Entonces

getSubsetSum(sa,?ta,?sa_size,?ta_size?-?1,? suma?-?sa(cnt_node),?cnt_node? ?1,?target)

Fin?Si

Regresar

Else

Si?cnt_node?lt;?sa_size?Y?sum? ?sa(cnt_node)?lt;=?target?Entonces

Para?i?=?cnt_node?To?sa_size?-?1? '?difier?de?c/c

ta(ta_size)?=?sa(i)

Si?sum?sa(i)?lt;=?target? Luego

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?generateSubsets(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< /

p>

Si?(sa(0)?lt;=?target)?Y?(total?gt;=?target)?Entonces

getSubsetSum(sa,?ta,?size, ?0,?0,?0,?target)

Fin?Si

Fin?Sub Private?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)?'difier?from?c/c

Para?i?=?LBound(data)?To?UBound(data)

data( i)?=?i?1

Siguiente?i

generarSubconjuntos(datos,?tamaño,?objetivo)

Fin?Sub