Условия: В неком государстве в обращении находятся банкноты определенных номиналов.
Условия: В некотором государстве в обращении находятся банкноты определенных номиналов. Национальный банк хочет, чтоб банкомат выдавал всякую запрошенную сумму при помощи минимального числа банкнот, считая, что запас банкнот каждого номинала неограничен. Помогите Национальному банку решить эту задачку.
Входные данные: 1-ая строка входных данных содержит естественное число n, 0lt;nlt;=100 (Количество разных видов номиналов). 2-ая строка входных данных содержит n различных естественных чисел x_1, x_2, x_3...,x_n (Значения номиналов банкнот), не превосходящих 1000000. 3-я строчка содержит натуральное число S, не превосходящее 5000000 (Сумма, которую нужно выдать)
Выходные данные: Программка должна отыскать представление числа S в виде суммы слагаемых из множества x_i, содержащее малое число слагаемых и вывести это представление на экран (в виде последовательности чисел, разделенных пробелами). Если таких представлений существует несколько, то программка обязана вывести хоть какое (одно) из их. Если такое представление не существует, то программка обязана вывести слово NO.
Пример:
Входные данные:
5
1 3 7 12 32
40
Выходные:
1 7 32
Входные:
5
5 10 50 100 500
99
Выходные:
NO
Помогите, я уже мозг сломал для себя, я не желаю списать Я Желаю Осознать!!!
Задать свой вопросvar
n, s, i: integer;
x: array[1..100]of integer;
answer: string;
begin
readln(n);
for i := 1 to n do
read(x[i]);
readln(s);
answer := IntToStr(s) + ' = ';
for i := n downto 1 do
begin
answer := answer + IntToStr(s div x[i]) + '*' + IntToStr(x[i]);
s := s mod x[i];
if i gt; 1 then
answer := answer + ' + ';
end;
if s lt;gt; 0 then
writeln('NO')
else
writeln(answer);
end.
Более полный и верный вариант решения, но и куда более трудный
//PascalABC.Net 3.1 сборка 1200
uses System.Collections.Generic;
uses System;
var
x := new Listlt;integergt;;
c := new Listlt;Tuplelt;string, integergt;gt;;
procedure getParcelling(sum, step: integer; coefficients: string; count: integer);
begin
if step gt;= x.Count then begin
if sum = 0 then c.Add((coefficients, count));
Exit;
end;
if step lt; 0 then step := 0;
for var j := 0 to (sum div x[step]) do
begin
var s := '';
if j gt; 0 then begin
if step gt; 0 then s += ' + ';
s += IntToStr(j) + '*' + IntToStr(x[step]);
end;
getParcelling(sum - x[step] * j, step + 1, coefficients + s, count + j);
end;
end;
begin
x := ReadArrInteger('x:', ReadInteger('n =')).ToList;
var sum := ReadInteger('sum =');
getParcelling(sum, 0, '', 0);
if c.Count = 0 then
writeln('No')
else begin
var min := c.Min(cc -gt; cc.Item2);
Println(c.Where(cc -gt; cc.Item2 = min));
end;
end.
-
Вопросы ответы
Статьи
Информатика
Статьи
Разные вопросы.
Математика.
Разные вопросы.
Математика.
Физика.
Геометрия.
Разные вопросы.
Обществознание.
Математика.
Химия.