¿Como averiguo el numero de combinaciones de un número?

Yo por ejemplo tengo el numero 30 y quiero saber las combinaciones que tiene este número solo usando 6 números que van del 1 al 13.

1 respuesta

Respuesta
1

Simplemente voy a transcribir casi en su totalidad la pregunta que me mandaste en privado para que pueda aparecer en el tablón, gracias por acceder a ello. Puedes saltarte lo que es la transcripción e ir al final.

-------------------------------------------------

EL USUARIO añadió a una pregunta mía:

Si se pueden repetir, pero el orden es indiferente, da igual tener 3 3 3 4 4 4 que 4 4 4 3 3 3, seria la misma combinación, el 1 se puede repetir dos veces, el 2 tres veces, el 3 cuatro veces, el 4,5,6,7,8,9, se pueden usar hasta cinco veces en la misma combinación, el 10 cuatro veces, el 11 tres veces, el 12 2 veces y el 13 una solo, estas son el numero de repeticiones que se podrían hacer con el mismo numero en la combinación.

------------------------------------------------------

Y la contestación mía fue:

Si, ya suponía que las combinaciones con los mismos números en distinto orden eran la misma. Para evitar repeticiones se generan únicamente las combinaciones en que los números van en orden creciente o como mucho iguales si está permitido. El cálculo del número de combinaciones posibles sería costoso aun cuando hubieras dicho que no se puede repetir ninguno o que hubieras dicho que se pueden repetir todos sin restricciones.

Así que con esas restricciones tan arbitrarias se hace imposible el cálculo previo y solo a posteriori se pueden saber cantas combinaciones hay.

Pues eso, hay que generar las combinaciones en orden creciente aplicando las restricciones y contarlas. Me temo que a mano va a ser muy largo, por eso lo mejor es usar un programa de ordenador. Pero vamos a hacer algún ejercicio de lógica a fin de simplificar la tarea del ordenador.

Sean a1 <= a2 <= a3 <= a4 <= a5 <= a6 los seis números.
A1+A2+A3+A4+A5+A6 = 30

Como a1 es el menor no podrá valer más de la sexta parte de 30 que es 5, pero como entonces habria seis cincos y eso no está permitido, el máximo valor de a1 es 4
1 <= a1 <= 4

El segundo menor es a2. Podrá llegar a valer hasta la parte entera de la quinta parte de 30-a1. Es decir la parte entera de la quinta parte de 29,28,27 o 26 que es 5
a1 <=a2 <= 5

Ahora vendrá a3. Nunca podrá valer 1 porque no se permiten tres unos. Y el máximo, será la cuarta parte de de 30-a1-a2 cuyo margen es (21.. 28) Luego puede ser 5, 6 o 7, ya no es fijo como antes
max{2, a2} <= a3 <= pe[(30-a1-a2)/4]

Y ahora viene a4. Tampoco puede valer 1. Como a3 ya es mayor de 1 no hace falta especificarlo. Como máximo será la parte entera de la tercera parte de 30-a1-a2-a3. El margen de eso es (14.. 26) luego a4 puede ir desde 4 a 8.
a3<= a4 <= pe[(30-a1-a2-a3)/3]

Con a5 ya vamos a considerar un valor mínimo teniendo en cuenta que solo quedará luego a6 para completar 30. Y el máximo será la parte entera de la  mitad de 30-a1-a2-a3-a4 max{a4, 17-a1-a2-a3-a4} <= a5 <= pe[(30-a1-a2-a3-a4)/2]

Finalmente a6 = 30-a1-a2-a3-a4-a5. Aunque está todo bien preparado y no creo que pasara, no estará mal verificar que esa cantidad sea mayor o igual que a5.
Pues esos son los límites para cada número, además aun cuado una combianción sume 30 habra que verificar que no se ha repetido ningún número más veces de las permnitidas. Y con el fin de hacer óptimo el programa no se hacen siempre las seis verificaciones al final en el último bucle sino que en cada bucle menos adentrado se calculan, guardan y eliminan las repeticiones momentaneas.

Con esos detelles hago este programa en Pascal.

program Sumas30(input, output, fichero);
{$mode objfpc}{$H+}
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };
{$R *.res}
type repeticiones = array[1..13] of integer;
const
  st: integer = 30; //Suma total
  mn: integer = 13;  // Máximo número
  maxrep: repeticiones = (2,3,4,5,5,5,5,5,5,4,3,2,1);
var
  a1,a2,a3,a4,a5,a6,i3,j3,j4,i5,j5,sp,contador: integer;
  rep: repeticiones;
  fichero: text;
begin
  assign (fichero, 'sumas30.txt');
  rewrite(fichero);
  contador := 0;
  sp:=0;   // Suma parcial
  for i3:=1 to 13 do rep[i3] := 0;
  for a1:=1 to 4 do
    begin
      sp:=a1; rep[a1]:=1;
      if rep[a1] <= maxrep[a1] then
        for a2:=a1 to 5 do
          begin
            sp:=sp+a2; rep[a2]:=rep[a2]+1;
            if rep[a2]<= maxrep[a2] then
              begin
                if a2>1 then i3:=a2 else i3:=2;
                j3:=(st-sp) div 4;
                for a3:=i3 to j3 do
                  begin
                    sp:=sp+a3; rep[a3]:=rep[a3]+1;
                    if rep[a3]<=maxrep[a3] then
                      begin
                        j4:=(st-sp) div 3;
                        for a4:=a3 to j4 do
                          begin
                            sp:=sp+a4; rep[a4]:=rep[a4]+1;
                            if rep[a4]<=maxrep[a4] then
                              begin
                                i5:=a4;
                                if st-sp-mn>i5 then i5:=st-sp-mn;
                                j5:= (st-sp) div 2;
                                for a5:= i5 to j5 do
                                  begin
                                    sp:=sp+a5;rep[a5]:=rep[a5]+1;
                                    if rep[a5]<=maxrep[a5] then
                                      begin
                                        a6:=st-sp;
                                        if (a6>=a5) and
                                        (rep[a6]<maxrep[a6]) and
                                        (a6<=mn) then
                                          begin
                                            contador:=contador+1;
                                            writeln(contador:4,a1:5,a2:3,a3:3,a4:3,a5:3,a6:3);
                                            writeln(fichero,contador:4,'.-',a1:5,a2:3,a3:3,a4:3,a5:3,a6:3);
                                          end;
                                      end;
                                    sp:=sp-a5;rep[a5]:=rep[a5]-1;
                                  end;
                              end;
                            sp:=sp-a4; rep[a4]:=rep[a4]-1;
                          end;
                      end;
                    sp:=sp-a3; rep[a3]:=rep[a3]-1;
                  end;
              end;
            sp:=sp-a2; rep[a2]:=rep[a2]-1;
          end;
      rep[a1] := 0;
    end;
  close(fichero);
  readln;
end.
 
Y los resultados en el fichero.txt fueron estos:
   1.-    1  1  2  2 11 13
   2.-    1  1  2  2 12 12
   3.-    1  1  2  3 10 13
   4.-    1  1  2  3 11 12
   5.-    1  1  2  4  9 13
   6.-    1  1  2  4 10 12
   7.-    1  1  2  4 11 11
   8.-    1  1  2  5  8 13
   9.-    1  1  2  5  9 12
  10.-    1  1  2  5 10 11
  11.-    1  1  2  6  7 13
  12.-    1  1  2  6  8 12
  13.-    1  1  2  6  9 11
  14.-    1  1  2  6 10 10
  15.-    1  1  2  7  7 12
  16.-    1  1  2  7  8 11
  17.-    1  1  2  7  9 10
  18.-    1  1  2  8  8 10
  19.-    1  1  2  8  9  9
  20.-    1  1  3  3  9 13
  21.-    1  1  3  3 10 12
  22.-    1  1  3  3 11 11
  23.-    1  1  3  4  8 13
  24.-    1  1  3  4  9 12
  25.-    1  1  3  4 10 11
  26.-    1  1  3  5  7 13
  27.-    1  1  3  5  8 12
  28.-    1  1  3  5  9 11
  29.-    1  1  3  5 10 10
  30.-    1  1  3  6  6 13
  31.-    1  1  3  6  7 12
  32.-    1  1  3  6  8 11
  33.-    1  1  3  6  9 10
  34.-    1  1  3  7  7 11
  35.-    1  1  3  7  8 10
  36.-    1  1  3  7  9  9
  37.-    1  1  3  8  8  9
  38.-    1  1  4  4  7 13
  39.-    1  1  4  4  8 12
  40.-    1  1  4  4  9 11
  41.-    1  1  4  4 10 10
  42.-    1  1  4  5  6 13
  43.-    1  1  4  5  7 12
  44.-    1  1  4  5  8 11
  45.-    1  1  4  5  9 10
  46.-    1  1  4  6  6 12
  47.-    1  1  4  6  7 11
  48.-    1  1  4  6  8 10
  49.-    1  1  4  6  9  9
  50.-    1  1  4  7  7 10
  51.-    1  1  4  7  8  9
  52.-    1  1  4  8  8  8
  53.-    1  1  5  5  5 13
  54.-    1  1  5  5  6 12
  55.-    1  1  5  5  7 11
  56.-    1  1  5  5  8 10
  57.-    1  1  5  5  9  9
  58.-    1  1  5  6  6 11
  59.-    1  1  5  6  7 10
  60.-    1  1  5  6  8  9
  61.-    1  1  5  7  7  9
  62.-    1  1  5  7  8  8
  63.-    1  1  6  6  6 10
  64.-    1  1  6  6  7  9
  65.-    1  1  6  6  8  8
  66.-    1  1  6  7  7  8
  67.-    1  1  7  7  7  7
  68.-    1  2  2  2 10 13
  69.-    1  2  2  2 11 12
  70.-    1  2  2  3  9 13
  71.-    1  2  2  3 10 12
  72.-    1  2  2  3 11 11
  73.-    1  2  2  4  8 13
  74.-    1  2  2  4  9 12
  75.-    1  2  2  4 10 11
  76.-    1  2  2  5  7 13
  77.-    1  2  2  5  8 12
  78.-    1  2  2  5  9 11
  79.-    1  2  2  5 10 10
  80.-    1  2  2  6  6 13
  81.-    1  2  2  6  7 12
  82.-    1  2  2  6  8 11
  83.-    1  2  2  6  9 10
  84.-    1  2  2  7  7 11
  85.-    1  2  2  7  8 10
  86.-    1  2  2  7  9  9
  87.-    1  2  2  8  8  9
  88.-    1  2  3  3  8 13
  89.-    1  2  3  3  9 12
  90.-    1  2  3  3 10 11
  91.-    1  2  3  4  7 13
  92.-    1  2  3  4  8 12
  93.-    1  2  3  4  9 11
  94.-    1  2  3  4 10 10
  95.-    1  2  3  5  6 13
  96.-    1  2  3  5  7 12
  97.-    1  2  3  5  8 11
  98.-    1  2  3  5  9 10
  99.-    1  2  3  6  6 12
100.-    1  2  3  6  7 11
101.-    1  2  3  6  8 10
102.-    1  2  3  6  9  9
103.-    1  2  3  7  7 10
104.-    1  2  3  7  8  9
105.-    1  2  3  8  8  8
106.-    1  2  4  4  6 13
107.-    1  2  4  4  7 12
108.-    1  2  4  4  8 11
109.-    1  2  4  4  9 10
110.-    1  2  4  5  5 13
111.-    1  2  4  5  6 12
112.-    1  2  4  5  7 11
113.-    1  2  4  5  8 10
114.-    1  2  4  5  9  9
115.-    1  2  4  6  6 11
116.-    1  2  4  6  7 10
117.-    1  2  4  6  8  9
118.-    1  2  4  7  7  9
119.-    1  2  4  7  8  8
120.-    1  2  5  5  5 12
121.-    1  2  5  5  6 11
122.-    1  2  5  5  7 10
123.-    1  2  5  5  8  9
124.-    1  2  5  6  6 10
125.-    1  2  5  6  7  9
126.-    1  2  5  6  8  8
127.-    1  2  5  7  7  8
128.-    1  2  6  6  6  9
129.-    1  2  6  6  7  8
130.-    1  2  6  7  7  7
131.-    1  3  3  3  7 13
132.-    1  3  3  3  8 12
133.-    1  3  3  3  9 11
134.-    1  3  3  3 10 10
135.-    1  3  3  4  6 13
136.-    1  3  3  4  7 12
137.-    1  3  3  4  8 11
138.-    1  3  3  4  9 10
139.-    1  3  3  5  5 13
140.-    1  3  3  5  6 12
141.-    1  3  3  5  7 11
142.-    1  3  3  5  8 10
143.-    1  3  3  5  9  9
144.-    1  3  3  6  6 11
145.-    1  3  3  6  7 10
146.-    1  3  3  6  8  9
147.-    1  3  3  7  7  9
148.-    1  3  3  7  8  8
149.-    1  3  4  4  5 13
150.-    1  3  4  4  6 12
151.-    1  3  4  4  7 11
152.-    1  3  4  4  8 10
153.-    1  3  4  4  9  9
154.-    1  3  4  5  5 12
155.-    1  3  4  5  6 11
156.-    1  3  4  5  7 10
157.-    1  3  4  5  8  9
158.-    1  3  4  6  6 10
159.-    1  3  4  6  7  9
160.-    1  3  4  6  8  8
161.-    1  3  4  7  7  8
162.-    1  3  5  5  5 11
163.-    1  3  5  5  6 10
164.-    1  3  5  5  7  9
165.-    1  3  5  5  8  8
166.-    1  3  5  6  6  9
167.-    1  3  5  6  7  8
168.-    1  3  5  7  7  7
169.-    1  3  6  6  6  8
170.-    1  3  6  6  7  7
171.-    1  4  4  4  4 13
172.-    1  4  4  4  5 12
173.-    1  4  4  4  6 11
174.-    1  4  4  4  7 10
175.-    1  4  4  4  8  9
176.-    1  4  4  5  5 11
177.-    1  4  4  5  6 10
178.-    1  4  4  5  7  9
179.-    1  4  4  5  8  8
180.-    1  4  4  6  6  9
181.-    1  4  4  6  7  8
182.-    1  4  4  7  7  7
183.-    1  4  5  5  5 10
184.-    1  4  5  5  6  9
185.-    1  4  5  5  7  8
186.-    1  4  5  6  6  8
187.-    1  4  5  6  7  7
188.-    1  4  6  6  6  7
189.-    1  5  5  5  5  9
190.-    1  5  5  5  6  8
191.-    1  5  5  5  7  7
192.-    1  5  5  6  6  7
193.-    1  5  6  6  6  6
194.-    2  2  2  3  8 13
195.-    2  2  2  3  9 12
196.-    2  2  2  3 10 11
197.-    2  2  2  4  7 13
198.-    2  2  2  4  8 12
199.-    2  2  2  4  9 11
200.-    2  2  2  4 10 10
201.-    2  2  2  5  6 13
202.-    2  2  2  5  7 12
203.-    2  2  2  5  8 11
204.-    2  2  2  5  9 10
205.-    2  2  2  6  6 12
206.-    2  2  2  6  7 11
207.-    2  2  2  6  8 10
208.-    2  2  2  6  9  9
209.-    2  2  2  7  7 10
210.-    2  2  2  7  8  9
211.-    2  2  2  8  8  8
212.-    2  2  3  3  7 13
213.-    2  2  3  3  8 12
214.-    2  2  3  3  9 11
215.-    2  2  3  3 10 10
216.-    2  2  3  4  6 13
217.-    2  2  3  4  7 12
218.-    2  2  3  4  8 11
219.-    2  2  3  4  9 10
220.-    2  2  3  5  5 13
221.-    2  2  3  5  6 12
222.-    2  2  3  5  7 11
223.-    2  2  3  5  8 10
224.-    2  2  3  5  9  9
225.-    2  2  3  6  6 11
226.-    2  2  3  6  7 10
227.-    2  2  3  6  8  9
228.-    2  2  3  7  7  9
229.-    2  2  3  7  8  8
230.-    2  2  4  4  5 13
231.-    2  2  4  4  6 12
232.-    2  2  4  4  7 11
233.-    2  2  4  4  8 10
234.-    2  2  4  4  9  9
235.-    2  2  4  5  5 12
236.-    2  2  4  5  6 11
237.-    2  2  4  5  7 10
238.-    2  2  4  5  8  9
239.-    2  2  4  6  6 10
240.-    2  2  4  6  7  9
241.-    2  2  4  6  8  8
242.-    2  2  4  7  7  8
243.-    2  2  5  5  5 11
244.-    2  2  5  5  6 10
245.-    2  2  5  5  7  9
246.-    2  2  5  5  8  8
247.-    2  2  5  6  6  9
248.-    2  2  5  6  7  8
249.-    2  2  5  7  7  7
250.-    2  2  6  6  6  8
251.-    2  2  6  6  7  7
252.-    2  3  3  3  6 13
253.-    2  3  3  3  7 12
254.-    2  3  3  3  8 11
255.-    2  3  3  3  9 10
256.-    2  3  3  4  5 13
257.-    2  3  3  4  6 12
258.-    2  3  3  4  7 11
259.-    2  3  3  4  8 10
260.-    2  3  3  4  9  9
261.-    2  3  3  5  5 12
262.-    2  3  3  5  6 11
263.-    2  3  3  5  7 10
264.-    2  3  3  5  8  9
265.-    2  3  3  6  6 10
266.-    2  3  3  6  7  9
267.-    2  3  3  6  8  8
268.-    2  3  3  7  7  8
269.-    2  3  4  4  4 13
270.-    2  3  4  4  5 12
271.-    2  3  4  4  6 11
272.-    2  3  4  4  7 10
273.-    2  3  4  4  8  9
274.-    2  3  4  5  5 11
275.-    2  3  4  5  6 10
276.-    2  3  4  5  7  9
277.-    2  3  4  5  8  8
278.-    2  3  4  6  6  9
279.-    2  3  4  6  7  8
280.-    2  3  4  7  7  7
281.-    2  3  5  5  5 10
282.-    2  3  5  5  6  9
283.-    2  3  5  5  7  8
284.-    2  3  5  6  6  8
285.-    2  3  5  6  7  7
286.-    2  3  6  6  6  7
287.-    2  4  4  4  4 12
288.-    2  4  4  4  5 11
289.-    2  4  4  4  6 10
290.-    2  4  4  4  7  9
291.-    2  4  4  4  8  8
292.-    2  4  4  5  5 10
293.-    2  4  4  5  6  9
294.-    2  4  4  5  7  8
295.-    2  4  4  6  6  8
296.-    2  4  4  6  7  7
297.-    2  4  5  5  5  9
298.-    2  4  5  5  6  8
299.-    2  4  5  5  7  7
300.-    2  4  5  6  6  7
301.-    2  4  6  6  6  6
302.-    2  5  5  5  5  8
303.-    2  5  5  5  6  7
304.-    2  5  5  6  6  6
305.-    3  3  3  3  5 13
306.-    3  3  3  3  6 12
307.-    3  3  3  3  7 11
308.-    3  3  3  3  8 10
309.-    3  3  3  3  9  9
310.-    3  3  3  4  4 13
311.-    3  3  3  4  5 12
312.-    3  3  3  4  6 11
313.-    3  3  3  4  7 10
314.-    3  3  3  4  8  9
315.-    3  3  3  5  5 11
316.-    3  3  3  5  6 10
317.-    3  3  3  5  7  9
318.-    3  3  3  5  8  8
319.-    3  3  3  6  6  9
320.-    3  3  3  6  7  8
321.-    3  3  3  7  7  7
322.-    3  3  4  4  4 12
323.-    3  3  4  4  5 11
324.-    3  3  4  4  6 10
325.-    3  3  4  4  7  9
326.-    3  3  4  4  8  8
327.-    3  3  4  5  5 10
328.-    3  3  4  5  6  9
329.-    3  3  4  5  7  8
330.-    3  3  4  6  6  8
331.-    3  3  4  6  7  7
332.-    3  3  5  5  5  9
333.-    3  3  5  5  6  8
334.-    3  3  5  5  7  7
335.-    3  3  5  6  6  7
336.-    3  3  6  6  6  6
337.-    3  4  4  4  4 11
338.-    3  4  4  4  5 10
339.-    3  4  4  4  6  9
340.-    3  4  4  4  7  8
341.-    3  4  4  5  5  9
342.-    3  4  4  5  6  8
343.-    3  4  4  5  7  7
344.-    3  4  4  6  6  7
345.-    3  4  5  5  5  8
346.-    3  4  5  5  6  7
347.-    3  4  5  6  6  6
348.-    3  5  5  5  5  7
349.-    3  5  5  5  6  6
350.-    4  4  4  4  4 10
351.-    4  4  4  4  5  9
352.-    4  4  4  4  6  8
353.-    4  4  4  4  7  7
354.-    4  4  4  5  5  8
355.-    4  4  4  5  6  7
356.-    4  4  4  6  6  6
357.-    4  4  5  5  5  7
358.-    4  4  5  5  6  6
359.-    4  5  5  5  5  6

 
Son 359 en total. Creo que están bien y son todos.
Espero que te sirva y lo hayas entendido.
Un saludo.

---------------------------------------------

El experto añadió:

Una petición (xxxxxx). Como puedes ver el problema es un ejercicio bastante completo que me gustaría saliese en el tablón porque creo que merece la pena que la gente lo pueda consultar y estoy orgulloso de él. Pero como pusiste que la pregunta fuera privada no podrá verlo nadie y es una pena. Por favor, no mandes preguntas privadas porque por responder un problema matemático no se desvela ningún secreto tuyo y hay preguntas que me gustaría que viese todo el mundo.

Podrías mandarme de nuevo la pregunta pero sin que sea privada.
Un saludo.

-----------------------------------------------

Y el usuario contyestó:

Hola, en primer lugar muchas gracias, necesito una cosita mas, esto que me has dejado es un programa en toda regla, ¿con qué puedo ejecutarlo?, porque me gustaría probarlo con otros números, lo de volverte a hacer la pregunta, la vuelvo a poner en el tablón general.
Un saludo.

----------------------------

Y el experto contestó:

El compilador usado es FreePascal, puedes descargarlo por si solo en.
http://www.freepascal.org/down/i386/win32-austria.var

Descarga el fichero que se llama win32 y luego el win64 si tienes windows de 64bits.

Si lo quieres par Linux u otra plataforma busca FreePascal en el Google y no te costará llegar.

Pero yo uso mejor un entorno de desarrollo basado en FreePascal que se llama Lazarus

http://sourceforge.net/projects/lazarus/files/

Es casi como Delphi lo único que me parece que el compilador que usa no es la última versión.
Creo que necesitarías algunos retoques en el programa si quieres usarlo para otros números porque este lo optimicé al máximo para el problema concreto que me pusiste y solo sirve para él. Si modificas las repeticiones de los números, la suma u otras cosas, los límites no se podrán aplicar tal cual están aquí porque añadirás o eliminarás elementos. Si eliminas pierdes casos y si añades te saldrán algunos que a lo mejor no cumplen todas las condiciones requeridas. Si sabes programación puedes intentar un programa más general con límites genéricos ye incluso cantidades de números variables, consultando al final si se cumplen todas las condiciones antes de dar una combinación por válida. Si no sabes programación será muy complicado.

Pero un programa general bueno es algo que ya sería excesivo para mí, me llevaría mucho tiempo.

Un saludo.

---------------------------------------------------------------------------------------------------------------

Y esa era a grandes rasgos la pregunta.

Luego te decía que para hacer las combinaciones que suman 40 había que hacer modificaciones. Y estoy intentando hacer un programa más general, aunque no mucho menos tosco y por supuesto sin entorno gráfico. Pero no sé cuándo lo terminaré o si lo terminaré. Si tengo trabajo por otros sitios puedo tardar varios días o más y ahora se avecinan días que tendré muchos asuntos personales que resolver.

Mándame una pregunta sobre ese tema y así cuando lo tenga hecho te mando el programa en esa nueva pregunta. Seguramente podré colgar el ejecutable, el código fuente y cuanto sea necesario en alguna página de descargas y te mandaré el enlace a ella. Sigue mandando las preguntas de modo público.

Ya veo que aunque las condiciones sean las mismas y solo cambie el número 30 por otro no es fiable al cien por cien. Vale si te parece en un par de semanas o por ahí te envío otra vez la pregunta y ya me comentas.

Gracias.

Un saludo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas