Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 11.08.2020
Сообщений: 16

Какой алгоритм применить к этой задачи?

11.08.2020, 15:13. Показов 1486. Ответов 5

Студворк — интернет-сервис помощи студентам
Привет всем. Недавно наткнулся на задачу с Муниципального этапа ВсОШ. Вот ее условие:

-----------------------------------------------------------------------------------------------------------------------------------------

В Берляндии в обиходе монеты достоинством 1, 2, 3, 4, 5 и 6 бурлей, толщина всех монет одинаковая. У Васи есть неограниченное количество монет каждого достоинства. Вася и Петя играют в следующую игру: Петя загадывает сумму
S, которую необходимо набрать, и сообщает Васе число N — количество монет, которые Вася может использовать. После этого Вася должен подобрать такие N монет, чтобы их сумма равнялась ровно S бурлям. Далее все N монет раскладываются в 6 стопок по номиналам.

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

ФОРМАТ ВВОДА:
В единственной строке подается число n, в следующих n строках вводится S и N

ФОРМАТ ВЫВОДА:
Вывести n строк - ответ для каждого S и N
Тесты:

INPUT:

1
30 6

OUTPUT:

0 0 0 0 6 0

написал код, но работает только на 56/100 баллов.

не подскажите какой алгоритм применить к данной задаче. Может воспользоваться Динамическим Программированием?

скиньте код и объяснение, если не сложно

спасибо всем заранее
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.08.2020, 15:13
Ответы с готовыми решениями:

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

Какой алгоритм у этой задачи с лампочками?
Здравствуйте, есть следующая задача: Дано квадратное поле из лампочек размером от 3*3 до 6*6. Часть включена, часть выключена. При...

Какую структуру данных, алгоритм применить для такой задачи?
Доброго времени суток. Задача следующая : Представьте себе что вы разработчик игры, какой-нибудь аркады. В конце как обычно есть...

5
 Аватар для LegionK
393 / 263 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
11.08.2020, 17:58
Можно ли увидеть систему проверки, куда можно код отправить и почитать оригинал условия?
0
1 / 1 / 0
Регистрация: 11.08.2020
Сообщений: 16
11.08.2020, 18:45  [ТС]
ссылка https://imcs.dvfu.ru/cats/stat... 63151.html
что бы проверить решение нужно принять виртуальное участие в соревновании.
0
 Аватар для LegionK
393 / 263 / 193
Регистрация: 02.05.2017
Сообщений: 1,003
11.08.2020, 19:43
Лучший ответ Сообщение было отмечено tyitoite как решение

Решение

Не знаю, можно было дп написать, конечно :
dp i j a - можно ли набрать сумму i из j количества монет, если брать монеты из первых a чисел (a = 1,2,3...6), потом восстановить ответ, жадно беря каждый тип монет, потом сравнить.
Но я так понимаю перебора хватило.
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int main()
{
 
    int t;
    cin >> t;
 
    for(int z = 0;z<t;++z){
 
        int n,m;
        cin >> n >> m;
 
        vector<int>ans;
 
        int ma = 0;
 
        for(int one = 0;;++one){            ///////////////
 
            if(one*1 > n || one > m)break;
 
            for(int two = 0;;++two){                //////////////
 
                if((two*2+one*1) > n || (two+one) > m)break;
 
                for(int three = 0;;++three){
 
                    if((three*3+one*1+two*2) > n || (three+one+two) > m)break;     ////////////
 
                    for(int four = 0;;++four){                      ///////////
 
                        if((four*4+three*3+one*1+two*2) > n || (four+one+two+three) > m)break;
 
                        for(int five = 0;;++five){                      ///////////
 
                            if((five*5+four*4+three*3+one*1+two*2) > n || (four+one+two+three+five) > m)break;
 
                            for(int six = 0;;++six){                        ///////////
 
                                //cout << one << two << three << four << five << six << "\n";
 
                                if((six*6+five*5+four*4+three*3+one*1+two*2) > n || (four+one+two+three+five+six) > m)break;
 
                                if((six*6+five*5+four*4+three*3+one*1+two*2) != n || (four+one+two+three+five+six) != m)continue;;
 
                                vector<int>temp = {one,two,three,four,five,six};
 
                                int var = *max_element(temp.begin(),temp.end());
 
                                if(var > ma){
                                    ma = var;
                                    ans = temp;
                                }
 
                            }
 
                        }
 
 
 
                    }
 
                }
 
            }
 
        }
 
        for(int i = 0;i<ans.size();++i)cout << ans[i] << ' ';
        cout << "\n";
 
    }
 
 
    return 0;
}
1
 Аватар для vantfiles
1018 / 1914 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
11.08.2020, 21:18
вы свое решение не привели, вы примерно так решали? :

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
#include <iostream>
#include <conio.h>
 
int main() 
{
  int mx1, mx2, mx3, mx4, mx5, mx6;
  int N, S, sum;
 
  N = 6;
  S = 30;
 
  mx1 = mx2 = mx3 = mx4 = mx5 = mx6 = N;
 
 
mx1 = ( S     < N ) ? S     : N;
mx2 = ( S / 2 < N ) ? S / 2 : N;
mx3 = ( S / 3 < N ) ? S / 3 : N;
mx4 = ( S / 4 < N ) ? S / 4 : N;
mx5 = ( S / 5 < N ) ? S / 5 : N;
mx6 = ( S / 6 < N ) ? S / 6 : N;
 
 
for( int i6 = 0; i6 <= mx6; i6++ ){
   for( int i5 = 0; i5 <= mx5; i5++ ){
      for( int i4 = 0; i4 <= mx4; i4++ ){
         for( int i3 = 0; i3 <= mx3; i3++ ){
            for( int i2 = 0; i2 <= mx2; i2++ ){
               for( int i1 = 0; i1 <= mx1; i1++ ){
                    if( i1 + i2 + i3 + i4 + i5 + i6 <= N ){
                        sum = i1 + 2*i2 + 3*i3 + 4*i4 + 5*i5 + 6*i6;
                        if( sum == S ){
                            cout << i1 << i2 << i3 << i4 << i5 << i6 << "\n";
                        }
                    }
               }
            }
         }
      }
   }
}
 
    return 0;
}
1
1 / 1 / 0
Регистрация: 11.08.2020
Сообщений: 16
12.08.2020, 04:41  [ТС]
Цитата Сообщение от vantfiles Посмотреть сообщение
вы свое решение не привели, вы примерно так решали? :

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
#include <iostream>
#include <conio.h>
 
int main() 
{
  int mx1, mx2, mx3, mx4, mx5, mx6;
  int N, S, sum;
 
  N = 6;
  S = 30;
 
  mx1 = mx2 = mx3 = mx4 = mx5 = mx6 = N;
 
 
mx1 = ( S     < N ) ? S     : N;
mx2 = ( S / 2 < N ) ? S / 2 : N;
mx3 = ( S / 3 < N ) ? S / 3 : N;
mx4 = ( S / 4 < N ) ? S / 4 : N;
mx5 = ( S / 5 < N ) ? S / 5 : N;
mx6 = ( S / 6 < N ) ? S / 6 : N;
 
 
for( int i6 = 0; i6 <= mx6; i6++ ){
   for( int i5 = 0; i5 <= mx5; i5++ ){
      for( int i4 = 0; i4 <= mx4; i4++ ){
         for( int i3 = 0; i3 <= mx3; i3++ ){
            for( int i2 = 0; i2 <= mx2; i2++ ){
               for( int i1 = 0; i1 <= mx1; i1++ ){
                    if( i1 + i2 + i3 + i4 + i5 + i6 <= N ){
                        sum = i1 + 2*i2 + 3*i3 + 4*i4 + 5*i5 + 6*i6;
                        if( sum == S ){
                            cout << i1 << i2 << i3 << i4 << i5 << i6 << "\n";
                        }
                    }
               }
            }
         }
      }
   }
}
 
    return 0;
}
не так, мой код:

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <iostream>
using namespace std;
 
int main()
{
 
    int c;
 
    cin >> c;
 
    int arr[50][6];
 
    int s_n[50][2];
 
    for (int i = 0; i < c; i++)
    {
 
        cin >> s_n[i][0] >> s_n[i][1];
 
    }
    for (int i = 0; i < 50; i++)
    {
 
        for (int j = 0; j < 6; j++)
        {
 
            arr[i][j] = 0;
 
        }
    }
    for (int i = 0; i < c; i++)
    {
 
        int S = s_n[i][0];
 
        int N = s_n[i][1];
 
        int t = (S + N - 1) / N;
 
        int pos = N;
 
        if (S % N == 0)
        {
 
            arr[i][t - 1] = pos;
 
            continue;
 
        }
 
        if (S - t * (N - 1) < 0)
        {
 
            t--;
 
 
        }
 
        if (S - t * (N - 1) > 0)
        {
 
            pos--;
 
            arr[i][S - t * (N - 1) - 1] = 1;
 
 
        }
 
        arr[i][t - 1] = pos;
 
    }
 
    for (int i = 0; i < c; i++)
    {
 
        for (int j = 0; j < 6; j++)
        {
 
            cout << arr[i][j] << " ";
 
        }
        cout << "\n";
 
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.08.2020, 04:41
Помогаю со студенческими работами здесь

Как правильно составить алгоритм этой задачи в QBasic?
Что я сделала не правильно? Задача такая...Каждый элемент главной диагонали матрицы D(3х3) заменить соответствующим элементом массива К...

Какой должен быть принцип работы у программы для этой задачи?
Формат ввода Целое число — количество строк, затем сами строки, в которых сначала записано название сказки, а потом её герой после...

Какой алгоритм подходит для решения задачи?
Если можно, объясните логику решения. Заранее спасибо Задача: Шоссе распростерлось от 0 до 1000 км. На этом шоссе в случайных местах...

Нужно разработать алгоритм решения этой задачи и изобразить его в виде блок -схемы и в виде структурированного текста (псевдокода).
Даны натуральное число m , одноименный действительный массив В порядка m. Переписать массив В в массив А в порядке убывания значения...

Какой NAT применить
Ребят доброго времени суток. Подскажите какой лучше НАТ применить. До этого тестовые схемы собирал. Кстати, ребята с форума помогали,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru