Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2011, 23:04   #1
kiborrgg
Delphi / C++
Пользователь
 
Аватар для kiborrgg
 
Регистрация: 29.09.2010
Сообщений: 28
По умолчанию Комбинаторика

Добрый вечер товарищи.
Прошу помощи в нахождении формулы для ниженаписаной задачи:

Допустим есть 7 ячеек памяти в которые мы будем хранить целые числа. Нужно найти всевозможные комбинации этих чисел таким образом чтоб сумма всех чисел в этих ячейках была постоянной - 35.

Пример:

Код:
1) 4 5 4 2 2 12 6     = 35
2) 3 5 3 2 2 13 7     = 35
3) ...
kiborrgg вне форума Ответить с цитированием
Старый 24.03.2011, 23:32   #2
sig_GB
Пользователь
 
Регистрация: 23.02.2010
Сообщений: 69
По умолчанию

Выборки (сочетания) с повторениями. Условие = сумма раван 35.
Помог? Нажми на <Весы> слева.
С++, Pascal, Assembler 386 - под заказ.
sig_GB вне форума Ответить с цитированием
Старый 25.03.2011, 00:40   #3
kiborrgg
Delphi / C++
Пользователь
 
Аватар для kiborrgg
 
Регистрация: 29.09.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от sig_GB Посмотреть сообщение
Выборки (сочетания) с повторениями. Условие = сумма раван 35.
Не могли бы Вы написать формулу, или кусок кода. На Паскале, Си - не важно.
Буду оч. благодарен.
kiborrgg вне форума Ответить с цитированием
Старый 25.03.2011, 01:56   #4
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Чтобы найти все комбинации целых чисел, сумма которых равна 35, нужно наложить доп. ограничения, поскольку таких комбинаций бесконечное количество.
В связи с этим вопрос: какие ограничения? Числа должны быть положительными или неотрицательными?
Также есть вопрос по поводу того, важен ли порядок чисел в этих ячейках, т.е. 1 1 1 1 1 1 29 и 1 29 1 1 1 1 1 это разные комбинации или одинаковые?
mMAg вне форума Ответить с цитированием
Старый 25.03.2011, 09:38   #5
kiborrgg
Delphi / C++
Пользователь
 
Аватар для kiborrgg
 
Регистрация: 29.09.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от mMAg Посмотреть сообщение
Чтобы найти все комбинации целых чисел, сумма которых равна 35, нужно наложить доп. ограничения, поскольку таких комбинаций бесконечное количество.
В связи с этим вопрос: какие ограничения? Числа должны быть положительными или неотрицательными?
Также есть вопрос по поводу того, важен ли порядок чисел в этих ячейках, т.е. 1 1 1 1 1 1 29 и 1 29 1 1 1 1 1 это разные комбинации или одинаковые?
Да, порядок чисел важен, 1 1 1 1 1 1 29 и 1 29 1 1 1 1 1 это разные комбинации

Числа должны быть положительными
kiborrgg вне форума Ответить с цитированием
Старый 25.03.2011, 10:39   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Код:
#include <stdio.h>

#define N 4    /* Отладка. Поставить 7 */
#define S 9    /* Отладка. Поставить 35 */

int a[N] ;
int k ;

void PrintA() {

   int i ;
   for ( i = 0; i < N; i++ )
      printf( " %d", a[i] ) ;
   printf( "\n" ) ;

}


int SumExceptAj( int j ) {

   int   i ,
         s = 0 ;
   for ( i = 0; i < N; i++ )
      if ( i != j )
         s += a[i] ;

   return s ;

}


void NextComb( int k ) {

   int j ;

   if ( k < 0 )
      return ;

   for ( j = k+1; j < N; j++ )
      a[j] = 1 ;

   if ( a[k] < S - SumExceptAj( k ) ) {
      ++a[k] ;
      a[N-1] = S - SumExceptAj( N-1 ) ;
      PrintA() ;
      NextComb( N-2 ) ;
   } else {
      NextComb( k-1 ) ;
   }

}


int main() {

   int i ;

   for ( i = 0; i < N-1; i++ )
      a[i] = 1 ;
   a[N-1] = S - SumExceptAj( N-1 ) ;
   PrintA() ;

   NextComb( N-2 ) ;

   return 0 ;

}
Только проверь, пожалуйста.
Vago вне форума Ответить с цитированием
Старый 25.03.2011, 15:50   #7
Летучий_СкилетиК
Форумчанин
 
Аватар для Летучий_СкилетиК
 
Регистрация: 04.02.2011
Сообщений: 260
По умолчанию

Код:
type Razb=array [byte] of byte;
    var N,i,L:byte;
	X:Razb;
    procedure Next(var X:Razb;var L:byte);
      var i,j:byte;
	  s:word;
    begin
      i:=L-1;s:=X[L];
      while (i>1)and(X[i-1]<=X[i]) do begin s:=s+X[i];dec(i) end;
      inc(X[i]);
      L:=i+s-1;
      for j:=i+1 to L do X[j]:=1
    end;
  begin
    n := 35;
    L:=N; for i:=1 to L do X[i]:=1;
    for i:=1 to L do write(X[i]);writeln;
    repeat
      Next(X,L);
      if L = 7 then begin
      for i:=1 to L do write(X[i],' ');writeln
      end;
    until L=1;
    readln;
  end.

Последний раз редактировалось Летучий_СкилетиК; 25.03.2011 в 15:53.
Летучий_СкилетиК вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Комбинаторика MadReason Помощь студентам 4 09.12.2010 22:52
Комбинаторика и переборы C# pro100saniok Помощь студентам 2 05.12.2010 16:00
Комбинаторика Васильева Зинаида Помощь студентам 1 15.10.2010 18:55
Комбинаторика в Паскале shegan Помощь студентам 0 21.12.2009 21:01