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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2010, 12:42   #1
Dionix
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 38
Восклицание Turbo Pascal. Задача.

Есть N одинаковых предметов и M пронумерованных ящиков.
Задача: Составьте программу BOXES, определяющую, сколько существует разных способов, которыми можно разместить все эти предметы в ящиках. Способы считаются разными, если они отличаются количеством предметов хотя бы в одном из ящиков.
Ввод: В текстовом файле BOXES.IN находятся два целых числа M и N. (M >= 1, N >= 1, M + N <= 60).
Вывод: В текстовый файл BOXES.OUT вывести целое число - количество различных способов размещения.
Пример
BOXES.IN
ВВОД:
2 2
BOXES.OUT
ВЫВОД:
3


заранее благодарен! )

Последний раз редактировалось Dionix; 30.06.2010 в 12:48.
Dionix вне форума Ответить с цитированием
Старый 30.06.2010, 13:16   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а мне задача не совсем понятна...
а в одном ящике сколько может быть предметов?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.06.2010, 13:22   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

а мне не ясны габариты ящиков и предметов.
а вдруг ящик резиновый - тогда кол-во способов (n*m)! Если правильно помню лекции
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.06.2010, 13:27   #4
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

А мне кажется что задача не в том разделе!
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 30.06.2010, 22:06   #5
Dionix
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 38
По умолчанию

предметы в ящике могут быть разложны как угодно...
например

два ящика и два предмета:

2 0
1 1
0 2

и в итоге получаем ответ 3
Dionix вне форума Ответить с цитированием
Старый 30.06.2010, 23:00   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Stilet
а вдруг ящик резиновый
Stilet, а ведь, похоже, Вы угадали — похоже ящики действительно не имеют размеров!

Dionix, а задачка действительно забавная... надо будет завтра подумать над алгоритмом.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.07.2010, 20:07   #7
Gumer
Пользователь
 
Регистрация: 16.01.2010
Сообщений: 43
По умолчанию

Для n<10 можно делать так: из исходных данных сделать число x:=n*10^m (10 в степени m) и дальше циклом for i:=1 to x do искать числа, сумма цифр которых будет равна n. Количество таких чисел будет ответом. Но возникнет проблема, когда число m будет больше 17.

Последний раз редактировалось Gumer; 01.07.2010 в 23:03.
Gumer вне форума Ответить с цитированием
Старый 05.07.2010, 23:55   #8
Gumer
Пользователь
 
Регистрация: 16.01.2010
Сообщений: 43
По умолчанию

Решение еще нужно? У меня есть мысль о правильном коде программы, но мне нереально лениво его писать.
Gumer вне форума Ответить с цитированием
Старый 06.07.2010, 09:02   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Gumer
У меня есть мысль о правильном коде программы
Gumer, ну-ка, поделитесь... мне лично любопытно.
Т.к. я решение вижу через цикл с рекурсией...

НО!! у меня всё время крутиться в голове мысль, что можно вывести мат.формулу, которая для заданных N и M вернёт число вариантов без всяких переборов!!

и ещё. Меня смущает вот эта часть условия:
Цитата:
M + N <= 60
для чего это задано? Подозреваю, что при вычислениях могут возникнуть ограничения по разрядной сетке?....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.07.2010, 16:17   #10
Gumer
Пользователь
 
Регистрация: 16.01.2010
Сообщений: 43
По умолчанию

Код:
var f:text;
    mas:array [1..60] of integer;
    n,m,i,x:integer;
    v:longint;

begin
assign(f, 'boxes.in');
ReSet (f);
Readln (f,m,n);
Close (f);

v:=0;

if m=1 then v:=1 else
repeat
x:=0;
inc(mas[1]);
for i:=1 to m do
 inc(x,mas[i]);

if (x=n) or (mas[1]=n) then
 begin
  inc(v);
  for i:=1 to m-1 do
   if mas[i]>=n then
    begin
     mas[i]:=0;
     inc(mas[i+1]);
    end
   else
    break;
 end;
if mas[m]=0 then inc(v);
until (mas[m]=n);


assign (f,'boxes.out');
ReWrite(f);
Writeln (f, v);
Close(f);
end.
Как я писал выше, можно эту задачу представить иначе:
У нас есть числа m и n, из которых можно составить число x:=n*10^m (10 в степени m). Остается лишь от 1 до x найти все числа, сумма цифр которых будет равна n. Но при n>9 и/или m>18 (где-то так) возникает трудность составить такое число x, поэтому я сворганил массив и когда какая-то ячейка массива равна n, я сбрасываю ее обратно в начало (присваиваю значение 0) и повышаю следующую.

Думаю, этот алгоритм правильный, но не очень эффективный при больших значениях m и n. Ввел 30 30 и прога повисла. Можно немного повысить эффективность, например, можно не продолжать увеличивать mas[1], если x=n.

Последний раз редактировалось Gumer; 06.07.2010 в 16:38.
Gumer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Turbo Pascal Demenz Помощь студентам 3 27.05.2010 09:08
Turbo Pascal or Pascal ABC Ikram Паскаль, Turbo Pascal, PascalABC.NET 0 27.04.2010 13:44
Turbo Pascal Ikram Помощь студентам 2 25.04.2010 10:26
а free pascal не читает задачи которые написаны на turbo pascal? demonara Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 16:28