Давайте решим задачу о том, сколько способов можно составить сумму в 27 рублей, используя не более 9 монет достоинством 1, 3 и 5 рублей. Для этого мы можем использовать метод динамического программирования.
Вот пример программы на языке C, которая будет решать данную задачу:
#include <stdio.h>
#define MAX_COINS 9
#define TARGET_SUM 27
int countWays(int coins[], int n, int sum) {
int dp[MAX_COINS + 1][sum + 1];
// Инициализация таблицы
for (int i = 0; i <= MAX_COINS; i++) {
for (int j = 0; j <= sum; j++) {
if (j == 0) {
dp[i][j] = 1; // Один способ составить сумму 0, не используя монеты
} else {
dp[i][j] = 0;
}
}
}
// Заполнение таблицы
for (int i = 1; i <= MAX_COINS; i++) {
for (int j = 1; j <= sum; j++) {
// Суммируем способы без текущей монеты
dp[i][j] = dp[i - 1][j];
// Проверяем, можем ли использовать каждую из монет
for (int k = 0; k < n; k++) {
if (j - coins[k] >= 0) {
dp[i][j] += dp[i - 1][j - coins[k]];
}
}
}
}
return dp[MAX_COINS][sum];
}
int main() {
int coins[] = {1, 3, 5};
int n = sizeof(coins) / sizeof(coins[0]);
int result = countWays(coins, n, TARGET_SUM);
printf("Количество способов составить сумму в %d рублей: %d\n", TARGET_SUM, result);
return 0;
}
Как работает программа:
Инициализация: Мы создаём двумерный массив
dp, чтобы хранить количество способов составить сумму, используя до 9 монет. Если сумма равна 0, то есть один способ — не использовать ни одной монеты.Заполнение массива: Мы проходим по количеству монет и суммам, обновляя количество способов составлять суммы в зависимости от недавних значений.
Использование монет: Для каждой суммы мы проверяем, можем ли использовать каждую из монет и добавляем количество способов, если это возможно.
Итоги:
Запустив вышеуказанную программу, вы получите количество способов, с помощью которых можно собрать сумму в 27 рублей, используя не более 9 монет достоинством 1, 3 и 5 рублей. Надеюсь, это поможет вам лучше понять решение задачи!
