Вопрос задан 01.05.2021 в 18:33. Предмет Информатика. Спрашивает Забутырина Валерия.

Помогите решить задачу в visual studio c++.Дано натуральное число n (n < 100). а) Определить

число способов выплаты суммы n рублей с помощью монет достоинством 1, 2, 5 рублей и бумажных купюр достоинством 10 рублей. б) Получить все способы выплаты (указать, какие монеты и купюры и в каком количестве следует использовать).
0 0
Перейти к ответам

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

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает Черных Настя.
#include <iostream>
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
0 0
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

Для решения этой задачи можно использовать динамическое программирование. Создадим массив 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 << "
0 0

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос