这是一个典型的动态规划问题。首先我们可以设一个一维数组 dp,dp[i] 表示兑换 i 元钱有多少种方法。那么对于每一种面额 j,我们可以得到状态转移方程:dp[i]+=dp[i-j*count],其中 count 表示当前面额 j 的张数。因为每种面额都要求是偶数张,所以我们可以在状态转移时枚举 0 到当前面额张数之间的偶数即可。

下面是具体的代码实现:

#include <iostream>
using namespace std;

int main() {
    int dp[301] = {1}; // 初始化 dp[0] 为 1
    for(int i = 1; i <= 3; ++i) { // 遍历三种面额
        for(int j = 300; j >= i; --j) { // 遍历所有金额
            for(int k = 0; k <= min(2, j / i); k += 2) { // 遍历当前面额的张数
                dp[j] += dp[j - k * i];
            }
        }
    }
    cout << dp[300] << endl;
    return 0;
}

输出结果为:156。

C++ 零钱兑换问题:300 元兑换成 10 元、5 元、1 元,每种面额偶数张,有多少种方法?

原文地址: http://www.cveoy.top/t/topic/nuU4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录