Условия: В неком государстве в обращении находятся банкноты определенных номиналов.

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

Входные данные: 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

Помогите, я уже мозг сломал для себя, я не желаю списать Я Желаю Осознать!!!

Задать свой вопрос
Павел Талышинский
а какой класс
Тема Вострецов
Олимпиадная для 8-ого класса, обычная для 11-ого класса.
Софья Шиплякова
ммм
Ишутов Артем
Спасибо за помощь!
1 ответ
Таковой вариант на ординарном паскале со стратегией алчность

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.
Павлик Игорек
Ахаха, а если все неясно? Не мог бы написать решение на школьном уровне знании инф-ки? Это олимпиадная задачка для 8-ого класса, обычная - для 11-ого. Заблаговременно признателен!
Содкин Степа
познания*
Ден Треухов
а разве это не школьный уровень? все вроде тривиально как мне кажется
Лидия Кривулина
есть число, надо его представить в виде суммы некого комплекта величин. от большего к наименьшему
Ленька Каленчиц
школьного уровня информатики я не помню, извини. Поэтому подупли код несколько раз, а потом задавай конкретные вопросы
Роман Скопенок
Да мне как раз интересно, как его решать на школьном уровне, ординарными кодами: циклами и массивами
Шурик Чевгол
ну так тут как раз и есть циклы и массивы. что конкретно не так? что тут такого необыкновенного? я чесно не вижу
Вася Ивашов
http://znanija.com/task/5643189 такой вариант может будет понятнее
, оставишь ответ?
Имя:*
E-Mail:


Добро пожаловать!

Для того чтобы стать полноценным пользователем нашего портала, вам необходимо пройти регистрацию.
Зарегистрироваться
Создайте собственную учетную запить!

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт