
Помогите решить задачу в visual studio c++.Дано натуральное число n (n < 100). а) Определить
число способов выплаты суммы n рублей с помощью монет достоинством 1, 2, 5 рублей и бумажных купюр достоинством 10 рублей. б) Получить все способы выплаты (указать, какие монеты и купюры и в каком количестве следует использовать).

Ответы на вопрос

using namespace std;
int main() {
int n,k10,k5,k2,k1,k;
cout << "n = ", cin >> n, cout << "\n";
k = 0;
for (k10=0; k10<=n / 10; k10++)
for (k5=0; k5<=(n-10*k10) / 5; k5++)
for (k2=0; k2<=(n-10*k10-5*k5) / 2; k2++) {
k1 = n-10*k10-5*k5-2*k2;
cout << k10 << " " << k5 << " " << k2 << " " << k1 << "\n";
k = k+1;
}
cout << "k = " << k;
return 0;
}
Пример:
n = 16
0 0 0 16
0 0 1 14
0 0 2 12
0 0 3 10
0 0 4 8
0 0 5 6
0 0 6 4
0 0 7 2
0 0 8 0
0 1 0 11
0 1 1 9
0 1 2 7
0 1 3 5
0 1 4 3
0 1 5 1
0 2 0 6
0 2 1 4
0 2 2 2
0 2 3 0
0 3 0 1
1 0 0 6
1 0 1 4
1 0 2 2
1 0 3 0
1 1 0 1
k = 25



Для решения этой задачи можно использовать динамическое программирование. Создадим массив dp[n+1], где dp[i] будет хранить число способов выплаты суммы i рублей. Инициализируем dp[0] = 1, так как для выплаты нулевой суммы нам не нужно ничего делать. Затем, используя формулу перехода, заполним массив dp.
Формула перехода для монет достоинством 1, 2, 5 рублей:
dp[i] += dp[i - 1] + dp[i - 2] + dp[i - 5]
Формула перехода для бумажных купюр достоинством 10 рублей:
dp[i] += dp[i - 10]
Чтобы получить все способы выплаты, нужно для каждого значения i от 0 до n построить список монет и купюр, которые мы использовали для выплаты суммы i. Для этого можно сохранять дополнительный массив coins[n+1], где coins[i] будет хранить список монет и купюр, которые мы использовали для выплаты суммы i рублей.
Приведу код на C++ для решения этой задачи:
cpp#include <iostream>
#include <vector>
using namespace std;
int main()
{
const int n = 50; // максимальная сумма для расчета
vector<int> dp(n+1); // массив для хранения числа способов выплаты
vector<vector<vector<int>>> coins(n+1); // массив для хранения монет и купюр
dp[0] = 1; // инициализируем dp[0] = 1
// рассчитываем dp[i] и coins[i] для каждого i от 1 до n
for (int i = 1; i <= n; ++i)
{
if (i >= 1)
{
dp[i] += dp[i - 1];
coins[i].insert(coins[i].end(), coins[i - 1].begin(), coins[i - 1].end());
coins[i].push_back({1});
}
if (i >= 2)
{
dp[i] += dp[i - 2];
coins[i].insert(coins[i].end(), coins[i - 2].begin(), coins[i - 2].end());
coins[i].push_back({2});
}
if (i >= 5)
{
dp[i] += dp[i - 5];
coins[i].insert(coins[i].end(), coins[i - 5].begin(), coins[i - 5].end());
coins[i].push_back({5});
}
if (i >= 10)
{
dp[i] += dp[i - 10];
coins[i].insert(coins[i].end(), coins[i - 10].begin(), coins[i - 10].end());
coins[i].push_back({10});
}
}
// выводим число способов выплаты для каждой суммы от 0 до n
cout << "


Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili