2024年5月1日发(作者:)

c++硬币面值组合枚举法介绍及代码实现

要使用枚举法解决硬币面值组合问题,可以按照以下步骤进行:

1. 定义变量和常量

假设硬币面值分别为1、5、10、25分,用常量COINS表示硬币面值的个

数。

2. 定义组合数和当前组合的变量

定义一个数组current_coin,用于记录当前组合的硬币面值。

3. 遍历所有硬币面值的组合情况

使用两层循环,外层循环控制当前组合的硬币面值的个数,内层循环枚举当

前组合的硬币面值。

4. 判断当前组合的总面值是否符合要求

如果当前组合的总面值等于目标金额,则输出当前组合的硬币面值;否则继

续枚举下一个组合。

下面是C++代码实现:

#include c++

using namespace std;

const int COINS = 4;

// 硬币面值的个数

const int TARGET = 100;

// 目标金额

int coins[COINS] = {1, 5, 10, 25};

// 硬币面值数组

int current_coin[COINS];

// 当前组合的硬币面值数组

bool used[COINS];

// 记录硬币是否已经被使用过

void dfs(int index) {

// 枚举所有硬币面值的组合情况

if (index == COINS) {

// 当前组合的硬币面值个数已经达到COINS个

int sum = 0;

for (int i = 0; i < COINS; i++) {

// 计算当前组合的总面值

sum += current_coin[i];

if (sum > TARGET) {

// 如果总面值已经超过目标金额,则退出循环

return;

}

}

if (sum == TARGET) {

// 如果总面值等于目标金额,则输出当前组合的硬币

面值

cout << "组合方案:" << endl;

for (int i = 0; i < COINS; i++) {

cout << coins[i] << " ";

}

cout << endl;

}

return;

} else {

// 枚举当前组合的硬币面值,分别为0、1、2、3个硬币面值的情况

for (int i = 0; i <= 3; i++) {

// i表示硬币面值的个数,取值为0~3,

对应4个硬币面值的情况

if (!used[i]) {

// 如果该硬币还没有被使用过,则加入当前组合中

current_coin[index] = coins[i];

used[i] = true;

// 标记该硬币已经被使用过

dfs(index + 1);

// 继续枚举下一个硬币的情况

used[i] = false;

// 回溯,将该硬币标记为未使用过,以便下一次

使用该硬币时可以重新使用它

}

}

}

}

int main() {

// 主函数,调用dfs函数开始枚举所有硬币面值的组合情况

dfs(0);

// 从第一个硬币开始枚举所有组合情况,初始时当前组合的硬币面值个数为

0个

return 0;

}