1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 9
1

Вычислить минимальное количество банкнот и монет в сумме

28.01.2014, 23:14. Показов 20267. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, очень надеюсь на вашу помощь.
Чтобы получить зачёт, надо написать программу в паскале. Мне попалась задача про монеты. Смысл такой - программа должна вычислить минимальное количество банкнот и монет в сумме. -> Пишите - 567 рублей. а программа считает: 500+50+10+5+2.

Задачка очень интересная, но у меня нет навыков, чтобы написать программу.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2014, 23:14
Ответы с готовыми решениями:

Конвертировать сумму в минимальное количество банкнот
Кто может помоч? Спасибо заранее. П.С Обычная школьная задача я сам учусь в школе :) Задача :...

Найти минимальное число монет достоинством в 50, 10, 5, и 1 копейку, необходимое для представения некоторой суммы
Найти минимальное число монет достоинством в 50, 10, 5, и 1 копейку, необходимое для представения...

Дана некоторая сумма денег. Разменять эту сумму банкнотами 1, 3, 5, 10, 20 так, чтобы количество банкнот было минимальным.
Дана некоторая сумма денег. Разменять эту сумму банкнотами 1, 3, 5, 10, 20 так, чтобы количество...

Вычислить выражение за минимальное количество операций
Использование оператора CASE При нажатии "1" выполнить задание: 2*х^4-3*x^3+4*x^2-5*x+6 (Ну за...

21
Платежеспособный зверь
8834 / 4268 / 1621
Регистрация: 28.10.2009
Сообщений: 11,407
28.01.2014, 23:44 2
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var
s,n:integer;
begin
readln(s);
n:=0;
n:=n+s div 5000;
s:=s mod 5000;
n:=n+s div 1000;
s:=s mod 1000;
n:=n+s div 500;
s:=s mod 500;
n:=n+s div 100;
s:=s mod 100;
n:=n+s div 50;
s:=s mod 50;
n:=n+s mod 10;
s:=s mod 10;
n:=n+s div 5;
s:=s mod 5;
n:=n+s;
writeln(n);
end.
1
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 9
29.01.2014, 00:12  [ТС] 3
Syntax error ";", expected but VAR found в первой строчке. открываю код программой Lazarus
0
Платежеспособный зверь
8834 / 4268 / 1621
Регистрация: 28.10.2009
Сообщений: 11,407
29.01.2014, 00:23 4
Задача написана на turboPascal, возможно Lazarus требует имя программы, добавьте в начало
program aaa;
1
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 9
29.01.2014, 00:29  [ТС] 5
Всё равно такая же ошибка.
0
Платежеспособный зверь
8834 / 4268 / 1621
Регистрация: 28.10.2009
Сообщений: 11,407
29.01.2014, 00:55 6
К сожалению, я не знаком с синтаксисом Lazarus, на TP всё идёт и выдает ответ, поинтересуйтесь у специалистов в разделе Lazarus

Добавлено через 21 минуту
Опечатка в строке 16. Правильно
n:=n div 10;

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var
s,n:integer;
begin
readln(s);
n:=0;
n:=n+s div 5000;
s:=s mod 5000;
n:=n+s div 1000;
s:=s mod 1000;
n:=n+s div 500;
s:=s mod 500;
n:=n+s div 100;
s:=s mod 100;
n:=n+s div 50;
s:=s mod 50;
n:=n+s div 10;
s:=s mod 10;
n:=n+s div 5;
s:=s mod 5;
n:=n+s;
writeln(n);
end.
1
351 / 344 / 279
Регистрация: 21.05.2013
Сообщений: 1,312
29.01.2014, 02:45 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<iostream>
using namespace std;
 
void Recur_Search(int sum,int n,int mas[],int &num_min,int num_cur,int mas_ef[],int mas_cur[]);
 
void main()
{
    int mas[100],n,sum;
    cout<<"Enter number = ";cin>>n;
    for(int i=0;i<n;i++)
    {
        cout<<"Enter "<<i+1<<" = ";
        cin>>mas[i];
    }
    cout<<"Suma = ";cin>>sum;
    cout<<"Bankomat = ";
    for(int i=0;i<n;i++)
        cout<<mas[i]<<" ";
    cout<<endl;
    int mas_ef[100],mas_cur[100],num_cur=-1,num_min=100,buf=n-1;
 
    Recur_Search(sum,n-1,mas,num_min,num_cur,mas_ef,mas_cur);
    if(num_min==100)cout<<"No solution";
    else
    {
        cout<<"Number of banknotes = "<<num_min<<endl;
        for(int i=0;i<num_min;i++) cout<<mas_ef[i]<<" ";
    }
    cout<<endl; 
}
 
void Recur_Search(int sum,int n,int mas[],int &num_min,int num_cur,int mas_ef[],int mas_cur[])
{
    if(num_cur!=-1)//начальная проверка - необходима из-за первого входа в рекурсивную процедуру
    {
        sum-=mas[n];//формирование суммы, необходимой для дозаполнения
        mas_cur[num_cur]=mas[n];//добавляем номинал к текущей последовательности
        num_cur++;
    }else num_cur=0;
 
    if(sum==0)//проверка, что необходимую сумму набрали.
    {
        if(num_min>num_cur)
        {//запись новой минимальной последовательности номиналов
            for(int i=0;i<num_cur;i++) mas_ef[i]=mas_cur[i];
            num_min=num_cur;
        }
    }
    else
        if((float(sum)/mas[n])<(num_min-num_cur)) //проверка на возможность добить сумму !!!текущими!!! максимальными купюрами
                //за меньшее количество купюр, чем текущее значение. Иначе возврат на предыдущую итерацию!!!
        {
            while((n>=0)&&(sum<mas[n])) n--;//поиск номинала меньше или равного необходимой суммы
            if(n>=0)//если нашелся необходимый номинал - обрабатываем дальше. Иначе возврат на предыдущую итерацию!!!
            {//последовательно прорабатываем все варианты для номиналов вниз
                for(int i=n;i>=0;i--) Recur_Search(sum,i,mas,num_min,num_cur,mas_ef,mas_cur);
            }
        }
}
1
Эксперт С++
4726 / 2547 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
29.01.2014, 06:50 8
Все зависит от того, какой номинал банкнот и монет имеется. В зависимости от этого жадный алгоритм может выдавать неправильные ответы.
0
Платежеспособный зверь
8834 / 4268 / 1621
Регистрация: 28.10.2009
Сообщений: 11,407
29.01.2014, 09:24 9
Лучший ответ Сообщение было отмечено ElenaPrg как решение

Решение

Непонятно, зачем здесь нужна рекурсивная процедура, да ещё на СИ, когда всё просто решается сверху вниз. Можно сделать и циклом.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
a,i,n,s:integer;
begin
readln(s);
n:=0;
a:=5000;
for i:=1 to 8 do
begin
n:=n+s div a;
s:=s mod a;
if i mod 2=1 then a:=a div 5 else a:=a div 2;
end;
writeln(n);
end.
1
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
29.01.2014, 10:33 10
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Const
  m : array[1..9] of Integer = (5000,1000,500,100,50,10,5,2,1);
Var
  Money,i : Integer;
  
Procedure tt(n : integer);
Begin
  While Money-n>=0 do
  Begin
    Dec(Money,n);
    Write(n); If Money>0 then write('+');
  End;
End;
 
Begin
  Readln(Money);
  Write(Money,' = ');
  For i:=1 to 9 do tt(m[i]);
  Writeln;
End.
Добавлено через 1 минуту
Это для любых сумм, а не только 3/4-ех значных.

Добавлено через 2 минуты
если нужно именно цифровое значение количества банкнот/монет, то надо будет добавить счетчик между 9-ой и 10-ой строкой.
0
Платежеспособный зверь
8834 / 4268 / 1621
Регистрация: 28.10.2009
Сообщений: 11,407
29.01.2014, 10:36 11
Цитата Сообщение от APALoff Посмотреть сообщение
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Const
  m : array[1..9] of Integer = (5000,1000,500,100,50,10,5,2,1);
Var
  Money,i : Integer;
  
Procedure tt(n : integer);
Begin
  While Money-n>=0 do
  Begin
    Dec(Money,n);
    Write(n); If Money>0 then write('+');
  End;
End;
 
Begin
  Readln(Money);
  Write(Money,' = ');
  For i:=1 to 9 do tt(m[i]);
  Writeln;
End.
Добавлено через 1 минуту
Это для любых сумм, а не только 3/4-ех значных.

Добавлено через 2 минуты
если нужно именно цифровое значение количества банкнот/монет, то надо будет добавить счетчик между 9-ой и 10-ой строкой.
очень красиво, но количество купюр не считает
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
29.01.2014, 10:38 12
Цитата Сообщение от кот Бегемот Посмотреть сообщение
очень красиво, но количество купюр не считает
Я же написал где счетчик вставить.

Добавлено через 1 минуту
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Const
  m : array[1..9] of Integer = (5000,1000,500,100,50,10,5,2,1);
Var
  Money,i,k : Integer;
  
Procedure tt(n : integer);
Begin
  While Money-n>=0 do
  Begin
    Inc(k);
    Dec(Money,n);
    Write(n); If Money>0 then write('+');
  End;
End;
 
Begin
  k:=0;
  Readln(Money);
  Write(Money,' = ');
  For i:=1 to 9 do tt(m[i]);
  Writeln;
  Writeln('Всего купюр/монет: ',k);
End.
1
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 9
31.01.2014, 05:25  [ТС] 13
Цитата Сообщение от кот Бегемот Посмотреть сообщение
var
a,i,n,s:integer;
begin
readln(s);
n:=0;
a:=5000;
for i:=1 to 8 do
begin
n:=n+s div a;
s:=s mod a;
if i mod 2=1 then a:=a div 5 else a:=a div 2;
end;
writeln(n);
end.

а как это изменить, если у меня в стране есть банкноты и монеты такого номинала: 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000?
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
31.01.2014, 09:24 14
Цитата Сообщение от ElenaPrg Посмотреть сообщение
а как это изменить, если у меня в стране есть банкноты и монеты такого номинала: 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Const
  m : array[1..12] of Integer = (5000,2000,1000,500,200,100,50,20,10,5,2,1);
Var
  Money,i,k : Integer;
  
Procedure tt(n : integer);
Begin
  While Money-n>=0 do
  Begin
    Inc(k);
    Dec(Money,n);
    Write(n); If Money>0 then write('+');
  End;
End;
 
Begin
  k:=0;
  Readln(Money);
  Write(Money,' = ');
  For i:=1 to 12 do tt(m[i]);
  Writeln;
  Writeln('Всего купюр/монет: ',k);
End.
1
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 9
31.01.2014, 09:51  [ТС] 15
APALoff, а какие комментарии можно к этому подписать?
0
1646 / 1075 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
31.01.2014, 10:10 16
Цитата Сообщение от ElenaPrg Посмотреть сообщение
APALoff, а какие комментарии можно к этому подписать?
Ну например:
Отлично работает!
Лучшая программа года!
Простота - залог успеха!
Краткость - сестра таланта!
и т.п.

Добавлено через 57 секунд
а вообще - любые можно написать...
1
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 9
31.01.2014, 10:21  [ТС] 17
главное зачёт мне получить сегодня) огромнейшее спасибо за программу программисты не как экономисты - всегда помогают.
1
Платежеспособный зверь
8834 / 4268 / 1621
Регистрация: 28.10.2009
Сообщений: 11,407
31.01.2014, 16:51 18
Цитата Сообщение от ElenaPrg Посмотреть сообщение
главное зачёт мне получить сегодня) огромнейшее спасибо за программу программисты не как экономисты - всегда помогают.

Беда любой хорошей программы в том, что препод не поверит и заставит объяснять что и как. Поэтому подправлю и свою, примитивную, но имеющую больше шансов прокатить:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
a,i,n,s:integer;
begin
readln(s);
n:=0;
a:=5000;
for i:=1 to 12 do
begin
n:=n+s div a;
s:=s mod a;
if i mod 3=1 then a:=(a*a) div 5 else a:=a div 2;
end;
writeln(n);
end.
Пояснение: последовательно, начиная с самой большой купюры, делим сумму на её номинал , выясняя, сколько таких купюр в сумме, и прибавляем результат к итогу (n:=n+s div a), потом уменьшаем сумму до остатка от деления (s:=s mod a), уменьшаем номинал вдвое или в 2,5 раза (в зависимости от номера операции) и продолжаем всё сначала.
1
22 / 20 / 5
Регистрация: 29.02.2016
Сообщений: 590
26.11.2019, 16:00 19
Бред, как и почти все решения в этой теме. При номиналах монет в {2,3,4}, ваш алгоритм разобьёт число "5" на что? Правильно, на "4", и всё. Он не сможет догадаться, что есть вариант взять "2 и 3". Он возьмёт один раз "4", и будет искать, где бы ему добить ещё "1". А "1" - нет монеты с таким номиналом.
1
2931 / 1576 / 630
Регистрация: 19.03.2019
Сообщений: 5,183
26.11.2019, 16:35 20
Цитата Сообщение от D7ILeucoH Посмотреть сообщение
Бред, как и почти все решения в этой теме.
вау, вау, полегче..
тема спокойно лежала пять лет, а ты её поднял. и зачем?
затем, чтобы повторить то, что сказано было
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Все зависит от того, какой номинал банкнот и монет имеется. В зависимости от этого жадный алгоритм может выдавать неправильные ответы.
?

для набора купюр
Цитата Сообщение от APALoff Посмотреть сообщение
1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000
у тебя претензии к представленному алгоритму есть?

а то, что он не работает на любом наборе данных, так тут ты прав. Но это же вроде никто и не обещал, верно?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2019, 16:35
Помогаю со студенческими работами здесь

Определить минимальное число и номиналы банкнот и монет, необходимые для набора заданной суммы
Имеется сумма в некоторой денежной системе. Определить минимальное число и номиналы банкнот и...

Определить количество банкнот и монет для формирования заданной суммы денег
программа читает сумму s и пару цифр после точки. определяет и выводит количество банкнот и монет....

Найти минимальное количество монет для выдачи сдачи
Пожалуйста, помогите найти ошибку! Программа ищет минимальное кол-во монет, для выдачи сдачи. У...

Выведите минимальное количество монет, которые нужно перевернуть
На столе лежат n монеток. Некоторые из них лежат вверх решкой, а некоторые – гербом. Определите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru