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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2007, 12:25   #1
caterva
 
Регистрация: 10.06.2007
Сообщений: 5
По умолчанию Задача на сумму к оплате.

Помогите пожалуйста, срочно нужно досдать задачу, а я не понимаю как ее писать, в алгоритм никак не въеду=\
С терминала вводится число n. Считая, что введенное число-сумма, подлежащая оплате, напечатать все варианты ее оплаты в банкнотах и монетах, имеющихся на данный момент в обороте. Найти способ, требующий наименьшего количества банкнот и монет. В задаче нужно использовать рекурсию, номиналы банкнот и монет беруться из файла или вводятся как константы, можно присваивать их внутри программы, это несущественно.
Если кто то может-помогите, нужно позарез просто=\
caterva вне форума Ответить с цитированием
Старый 11.06.2007, 17:44   #2
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

По секрету (из тервера) расскажу, что если N-ом обзовем количество уникальных денюжек (купюр или монетов), то всего вариантов, которыми можно набрать требуемую сумму (максимальное их количество):

Все варианты не стал перебирать - это не сложно.


В моей реализации: M( N=11 )=2047 вариантов. А потому алгоритм следующий:
1) Лучший вариант – в котором наименьшее количество банкнот и монет).
2) Если номиналы выразить в рублях, то монета определяется из условия: n<10
3) Сразу сообразим: если получится удачная комбинация из Z<N денюжек, то рассматривать комбинации Z+1 не имеет смысла по определению, потому будем сначала набирать сумму максимальными денюжками (рекурсией).
4) Кстати, кто не знаком с особенностями машинной арифметики:
в проге в переменной s накапливается после нескольких итераций ошибки округления. Пошагово можете посмотреть, кому интересно. В первую очередь подозрения ложатся на криворукость Борланда в фунции trunc.
Поэтому условие: s<>0 пришлось заменить на |s|>0.001;

Код:
const N = 11; // число уникальных монет и купюр
      mon  : array [1..N] of real =(5000,1000,500,100,50,10,5,1,0.1,0.05,0.01);  // массив с номиналами денюжек (в руб.)

var   comb : array[1..N] of integer;  // комбинации банкнот разных порядков (порядок - порядковый номер в массиве mon)

procedure money(s:real;p:integer);  // сколькими банкнотами p-го порядка можно набрать сумму, не превосходящую s
begin
     comb[p]:= comb[p] + trunc(s/mon[p]);
     s:= s - comb[p]*mon[p];
     if {s<>0}abs(s)>0.001 then begin
        inc(p);
        money(s,p);
     end;     
end;

procedure TForm1.Button1Click(Sender: TObject);
var p : integer;
    s : real;
begin
     memo1.clear;
     s:= strtofloat(edit1.text);
     for p:=1 to N do comb[p]:=0;
     money(s,1);
     for p:=1 to N do
         if comb[p]<>0 then begin
            if mon[p]>10 then memo1.lines.add(' + '+inttostr(comb[p])+' * '+inttostr(trunc(mon[p]))+'руб.')
            else memo1.lines.add(' + '+inttostr(comb[p])+' * '+inttostr(trunc(100*mon[p]))+'коп.');
         end;

end;
Исходник здесь!
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.

Последний раз редактировалось InternetStranger; 11.06.2007 в 17:50.
InternetStranger вне форума Ответить с цитированием
Старый 11.06.2007, 18:42   #3
caterva
 
Регистрация: 10.06.2007
Сообщений: 5
По умолчанию

Спс) Но..файл исходника поврежден, и открываться отказывается=\ и если честно, не совсем понятны значения команд memo1.clear , strtofloat(edit1.text) , memo1.lines.add , inttostr...Поясните плиз)))

Последний раз редактировалось caterva; 11.06.2007 в 18:46.
caterva вне форума Ответить с цитированием
Старый 11.06.2007, 21:28   #4
Elm0
ObjectPascal,CISCO
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 294
По умолчанию

Цитата:
Сообщение от caterva Посмотреть сообщение
и если честно, не совсем понятны значения команд memo1.clear , strtofloat(edit1.text) , memo1.lines.add , inttostr...Поясните плиз)))
Delphi это..
Elm0 вне форума Ответить с цитированием
Старый 11.06.2007, 21:36   #5
caterva
 
Регистрация: 10.06.2007
Сообщений: 5
По умолчанию

...нда..теперь ясно) просто мне задача на паскале нужна, да и сама я только паскаль и с++ знаю)) а..нельзя то же самое в паскаль перевести?
caterva вне форума Ответить с цитированием
Старый 11.06.2007, 23:00   #6
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

можно и на паскале. че-то я забыл про название раздела.
качай
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Старый 11.06.2007, 23:48   #7
caterva
 
Регистрация: 10.06.2007
Сообщений: 5
По умолчанию

хм..я так понимаю, эта программа выводит только максимальное количество купюр и монет, из которого можно собрать заданную сумму. А как вывести все возможные варианты?
caterva вне форума Ответить с цитированием
Старый 12.06.2007, 13:02   #8
caterva
 
Регистрация: 10.06.2007
Сообщений: 5
По умолчанию

ну в общем, спс огромное, я ее сама решила) там он ме правда ошибку выводит хз почему, но , думаю, разберусь. Спс за помощь+)
caterva вне форума Ответить с цитированием
Старый 12.06.2007, 14:12   #9
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Вот и прелесть, здрава будь) можешь даже код сюда вывесить. так на всякий случай
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
показать кол-во и сумму приходов Romuald Microsoft Office Excel 10 02.09.2008 14:17
впочему не выводит сумму???? макс07 Общие вопросы C/C++ 2 15.05.2008 20:25
Подсчитать сумму! Deman4eg Microsoft Office Excel 2 02.04.2008 09:16
#Delphi задача на сумму цифр числа forumu Помощь студентам 11 12.01.2008 19:02
Задача по оплате BedDog Паскаль, Turbo Pascal, PascalABC.NET 1 23.05.2007 06:42