Suma  de  subconjuntos.  Enumeración. Subset  sum.  Enumeration.⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

in STEMGeeks5 months ago (edited)
EspañolEnglish

Dado un conjunto arbitrario de enteros,

¿ Existe un subconjunto cuya suma sea exactamente un valor dado ?

 

 

 

   

 

+

 

       


En esta ocasión nos vamos a ocupar de una versión del problema enunciado, restringiendo el conjunto de partida a los enteros positivos.

Este problema puede abordarse en el contexto de las particiones de enteros, ver [suma_de_subconjuntos@j2e2xae] , pero en este caso vamos a solucionarlo en la forma de una recurrencia.

 

Recurrencia

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       

Dados un conjunto de enteros positivos S = { a1 , a2 , ... am } y un entero positivo k,

             ∑ a   >   k
m

Definimos una función F , con valor el número de subconjuntos de S con suma k .

F ( n1 ,n2 ...nm ; k )

nm < k  ∀ m

Si quitamos el elemento nm , el subconjunto resultante da lugar a dos opciones para la realización de la suma, puedes elegir entre k  y  k nm .

F ( n1 ,n2 ...nm ; k ) = F ( n1 ,n2 ...nm-1 ; k nm ) + F ( n1 ,n2 ...nm-1 ; k )

Hemos determinado una relación de recurrencia que nos permite resolver el problema de dimensión ( m, k ) con las soluciones en ( m  − 1,  k  − n m  ) y ( m  − 1,  k  ).

Teniendo en cuenta las igualdades siguientes,

F (⋯ ; 0 ) = 0     

  F (⋯ k ⋯ ; k ) = 1 + F (⋯ ; k )

S < k F (S ; k ) = 0

S = k F (S ; k ) = 1

 

Podemos construir una solución recursiva ,
con casos base, ecuación ,( ∅ , k ) y ( S , 0 ),
que ha de conservar las propiedades y .

Ordenar los elementos del conjunto de forma ascendente facilita la tarea de verificar las propiedades.

 

Ejemplo

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       

S = { 1, 2, 3, 5, 10, 15, 20, 50 }, k = 73

∑ (1, 2, 3, 5, 10, 15, 20, 50) > 73

F (1, 2, 3, 5, 10, 15, 20, 50; 73) =
F1 (1, 2, 3, 5, 10, 15, 20; 23) +
F2 (1, 2, 3, 5, 10, 15, 20; 73)

F1 : ∑ (1, 2, 3, 5, 10, 15, 20) > 23
F1 (1, 2, 3, 5, 10, 15, 20; 23) =
F11 (1, 2, 3, 5, 10, 15; 13) +
F13 (1, 2, 3, 5, 10, 15; 23)

F11 (1, 2, 3, 5, 10, 15; 13) = F11 (1, 2, 3, 5, 10; 13)
∑ (1, 2, 3, 5, 10) > 13
F11 (1, 2, 3, 5, 10; 13) =
F21 (1, 2, 3, 5; 3) +
F23 (1, 2, 3, 5; 13)

F21 (1, 2, 3, 5; 3) = F21 (1, 2, 3; 3)
F21 (1, 2, 3; 3) = 1 + F33 (1, 2; 3)

F21 (1, 2, 3, 5; 3) = 2      
F23 (1, 2, 3, 5; 13) = 0     
F11 (1, 2, 3, 5, 10; 13) = 2   
F13 (1, 2, 3, 5, 10, 15; 23) = 2 
F1 (1, 2, 3, 5, 10, 15, 20; 23) = 4
F2 (1, 2, 3, 5, 10, 15, 20; 73) = 0

F (1, 2, 3, 5, 10, 15, 20, 50; 73) = 4 + 0 = 4

 


EnglishEspañol

An integer set given,

Is there any subset that sums precisely upto other integer ?

 

 

 

 

   

 

+

 

 

       


We restrict our attention to a variant of this problem involving positive integers only.

This problem could be solved as an integer partitions one, see [subset_sum@j2e2xae], now we are solving it by a recurrence relation.

 

Recurrence

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       

Given a positive integer set S = { a1 , a2 , ... am } and a positive integer k,

             ∑ a   >   k
m

A function defined F , with value the number of S subsets that sum upto k .

F ( n1 ,n2 ...nm ; k )

nm < k  ∀ m

Drop nm , remaining subset has two options to sum, k or ( k nm ),

F ( n1 ,n2 ...nm ; k ) = F ( n1 ,n2 ...nm-1 ; k nm ) + F ( n1 ,n2 ...nm-1 ; k )

That is a recurrence relation that solves the problem ( m, k ) using solutions ( m  − 1,  k  − n m  ) and ( m  − 1,  k  ).

Note the equalities,

F (⋯ ; 0 ) = 0     

  F (⋯ k ⋯ ; k ) = 1 + F (⋯ ; k )

S < k F (S ; k ) = 0

S = k F (S ; k ) = 1

 

We can build a recursive solution ⒜ and ,
with base cases, ( ∅ , k ) and ( S , 0 ), in equation
and an invariant as properties and .

Ascendig ordering makes verifying invariant properties easier.

 

Example

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       

S = { 1, 2, 3, 5, 10, 15, 20, 50 }, k = 73

∑ (1, 2, 3, 5, 10, 15, 20, 50) > 73

F (1, 2, 3, 5, 10, 15, 20, 50; 73) =
F1 (1, 2, 3, 5, 10, 15, 20; 23) +
F2 (1, 2, 3, 5, 10, 15, 20; 73)

F1 : ∑ (1, 2, 3, 5, 10, 15, 20) > 23
F1 (1, 2, 3, 5, 10, 15, 20; 23) =
F11 (1, 2, 3, 5, 10, 15; 13) +
F13 (1, 2, 3, 5, 10, 15; 23)

F11 (1, 2, 3, 5, 10, 15; 13) = F11 (1, 2, 3, 5, 10; 13)
∑ (1, 2, 3, 5, 10) > 13
F11 (1, 2, 3, 5, 10; 13) =
F21 (1, 2, 3, 5; 3) +
F23 (1, 2, 3, 5; 13)

F21 (1, 2, 3, 5; 3) = F21 (1, 2, 3; 3)
F21 (1, 2, 3; 3) = 1 + F33 (1, 2; 3)

F21 (1, 2, 3, 5; 3) = 2      
F23 (1, 2, 3, 5; 13) = 0     
F11 (1, 2, 3, 5, 10; 13) = 2   
F13 (1, 2, 3, 5, 10, 15; 23) = 2 
F1 (1, 2, 3, 5, 10, 15, 20; 23) = 4
F2 (1, 2, 3, 5, 10, 15, 20; 73) = 0

F (1, 2, 3, 5, 10, 15, 20, 50; 73) = 4 + 0 = 4

 



Media Public domain, via Wikimedia Commons

   
       

Sort:  

Congratulations @j2e2xae! You have completed the following achievement on the Hive blockchain And have been rewarded with New badge(s)

You distributed more than 500 upvotes.
Your next target is to reach 600 upvotes.

You can view your badges on your board and compare yourself to others in the Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP