profile
Размещено 5 лет назад по предмету Информатика от FGSBHsfg

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

Входные данные: Первая строка входных данных содержит натуральное число n, 0<n<=100 (Количество  различных видов номиналов). Вторая строка входных данных содержит n различных натуральных чисел x_{1}, x_{2}, x_{3}...,x_{n} (Значения номиналов банкнот), не превосходящих 1000000. Третья строчка содержит натуральное число S, не превосходящее 5000000 (Сумма, которую нужно выдать)

 Выходные данные: Программа должна найти представление числа S в виде суммы слагаемых из множества {x_{i}}, содержащее минимальное число слагаемых и вывести это представление на экран (в виде последовательности чисел, разделенных пробелами). Если таких представлений существует несколько, то программа должна вывести любое (одно) из них. Если такое представление не существует, то программа должна вывести слово NO

 

Пример:

 

Входные данные:

5

1 3 7 12 32

40

Выходные: 

1 7 32

           

 

Входные:

5

5 10 50 100 500

99

Выходные:

NO

 

Помогите, я уже мозг сломал себе, я не хочу списать Я ХОЧУ ПОНЯТЬ!!!

 

  1. Ответ на вопрос
    Ответ на вопрос дан archery
    такой вариант на простом паскале со стратегией жадность

    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 > 1 then
                answer := answer + ' + ';
        end;
       
        if s <> 0 then
            writeln('NO')
        else
            writeln(answer);
    end.

    Более полный и правильный вариант решения, но и куда более сложный

    //PascalABC.Net 3.1 сборка 1200
    uses System.Collections.Generic;
    uses System;
    var
        x := new List<integer>;
        c := new List<Tuple<string, integer>>;

    procedure getParcelling(sum, step: integer; coefficients: string; count: integer);
    begin
        if step >= x.Count then begin
            if sum = 0 then c.Add((coefficients, count));
            Exit;
        end;
        if step < 0 then step := 0;
        
        for var j := 0 to (sum div x[step]) do
        begin
            var s := '';
            if j > 0 then begin
                if step > 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 -> cc.Item2);
            Println(c.Where(cc -> cc.Item2 = min));
        end;
    end.
    1. Ответ на вопрос
      Ответ на вопрос дан archery
      есть число, надо его представить в виде суммы некоторого набора величин. от большего к меньшему
    2. Ответ на вопрос
      Ответ на вопрос дан archery
      школьного уровня информатики я не помню, извини. Потому подупли код несколько раз, а потом задавай конкретные вопросы
    3. Ответ на вопрос
      Ответ на вопрос дан FGSBHsfg
      Да мне как раз интересно, как его решать на школьном уровне, простыми кодами: циклами и массивами
    4. Ответ на вопрос
      Ответ на вопрос дан archery
      ну так тут как раз и есть циклы и массивы. что именно не так? что тут такого необычного? я чесно не вижу
    5. Ответ на вопрос
      Ответ на вопрос дан archery
      http://znanija.com/task/5643189 такой вариант может будет понятнее
Не тот ответ на вопрос, который вам нужен?
Найди верный ответ
Самые новые вопросы
tegysigalpa2012
Русский язык - 6 лет назад

Помогите решить тест по русскому языку тест по русскому языку «местоимение. разряды местоимений» для 6 класса 1. укажите личное местоимение: 1) некто 2) вас 3) ни с кем 4) собой 2. укажите относительное местоимение: 1) кто-либо 2) некоторый 3) кто 4) нам 3. укажите вопросительное местоимение: 1) кем-нибудь 2) кем 3) себе 4) никакой 4. укажите определительное местоимение: 1) наш 2) который 3) некий 4) каждый 5. укажите возвратное местоимение: 1) свой 2) чей 3) сам 4) себя 6. найдите указательное местоимение: 1) твой 2) какой 3) тот 4) их 7. найдите притяжательное местоимение: 1) самый 2) моего 3) иной 4) ничей 8. укажите неопределённое местоимение: 1) весь 2) какой-нибудь 3) любой 4) этот 9. укажите вопросительное местоимение: 1) сколько 2) кое-что 3) она 4) нами 10. в каком варианте ответа выделенное слово является притяжательным местоимением? 1) увидел их 2) её нет дома 3) её тетрадь 4) их не спросили

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.