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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2010, 20:42   #1
phenix
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 12
По умолчанию Перебор всех возможных вариантов

Вот задача:

Серёжка недавно нашел магичесике кубики. N штук с записанными на них какими-то различными числами.
Сначала он решил сгруппировать некоторые кубики так, чтобы в сумме было 2010. С этой задачей он справился легко, но его брат Руслан предложил ему решить кое-что посложнее, а именно:
подсчитать количество различных способов, которыми можно собрать некоторую сумму M при помощи его кубиков.
Формат ввода:
В первой строке находится целые числа N и M.
Далее следует N чисел:
A1
...
AN
Ai – число написанное на кубике.
1<=N<=20, 1<=M<=10^18 ,1<=Ai<=10^18
Формат вывода:
Выведите количество способов.

Вот моё решение

Код:
var
  a : array[1..20] of integer;
  b : array[1..20] of boolean;
  i,j,n,m,s,sum,sum1,StepNumber,k,c : integer;
  
begin
  readln(n,m);
  for i:=1 to n do readln(a[i]);
  for i:=1 to n-1 do
    for j:=i+1 to n do
      begin
        if a[i]>a[j]
          then
            begin
              s:=a[i];
              a[i]:=a[j];
              a[j]:=s
            end;
      end;
  i:=1;
  while (a[i]<=m) and (i<n) do i:=i+1;
  s:=i;
  sum:=1;
  for i:=1 to s do sum:=sum*2;
  sum:=sum-1;
  StepNumber:=0;
  for i:=1 to sum do
    begin
      k:=i;
      c:=0;
      sum1:=0;
      while k<>0 do
        begin
          Inc(c);
          if k mod 2 =1
            then 
              begin
                k:=k div 2;
                b[c]:=true;
              end
            else
              begin
                k:=k div 2;
                b[c]:=false;
              end;
        end;
      for j:=1 to c do
        if b[j]
          then sum1:=sum1+a[j];
      if sum1=m
        then Inc(StepNumber);
    end;
  writeln(StepNumber);
end.

Помогите решить проблему, при тестировании не проходит тесты, когда m равняется 191592713146418 и более выскакивает ошибка. Подскажите плиз правильное решение или идею как решить.
phenix вне форума Ответить с цитированием
Старый 03.12.2010, 20:45   #2
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

скорее всего это не ошибка в коде, просто число в тип integer не входит... попробуй в описании использовать вместо integer, longint (или даже int64).

Последний раз редактировалось unbanned; 03.12.2010 в 20:53.
unbanned вне форума Ответить с цитированием
Старый 03.12.2010, 20:55   #3
phenix
Пользователь
 
Регистрация: 03.12.2010
Сообщений: 12
По умолчанию

Не подходит. Всё равно выскакивает ошибка при значении m 191592713146418
phenix вне форума Ответить с цитированием
Старый 03.12.2010, 21:29   #4
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

Цитата:
Сообщение от phenix Посмотреть сообщение
Код:
var
  a : array[1..20] of int64;
 .......
  i,j,n,m,s,sum,sum1,StepNumber,k,c : int64;
  
begin
.....
end.
а так? у меня значение вводиться допустим...
unbanned вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
с++ Перебор всех возможных подмножеств множества целых чисел Modlika17 Помощь студентам 19 10.01.2012 11:09
Перебор всех возможных сумм элеметов массива Sanakan Помощь студентам 3 29.03.2010 00:28
Перебор возможных комбинаций символов Toxask8 Общие вопросы C/C++ 1 12.12.2009 21:33
Реализовать перебор всех возможных IP-адресов (С++) ak74m Помощь студентам 0 09.04.2009 13:59
Перебор всех возможных вариантов [MI_nor] Общие вопросы C/C++ 9 01.04.2009 21:17