有3种硬币若干个,面值分别是1角、5角和1元,如果要凑够2元6角,设计一个算法求有哪些组合方式,共多少种组合方式。写c++代码
时间: 2024-10-08 18:11:41 浏览: 32
编写程序,输出用一元人民币兑换成1分、2分和5分硬币共有多少种兑换方法。
这是一个经典的动态规划问题,可以使用递归来解决。首先,我们需要定义一个二维数组`dp[i][j]`,表示从0到`i`的金额中,使用硬币的最大组合数,其中`j`表示剩余需要找零的金额。
这里是一个简单的C++代码实现:
```cpp
#include <vector>
using namespace std;
int coinChange(vector<int>& coins, int target) {
vector<vector<int>> dp(target + 1, vector<int>(101)); // 初始化dp数组
dp[0][0] = 1; // 当金额为0时,有1种组合(空组合)
for (int i = 0; i <= target; ++i) {
for (int j = 0; j <= 100; ++j) {
if (i >= coins[j]) { // 可以用当前面值的硬币
dp[i][j] += dp[i - coins[j]][j]; // 更新组合数
}
}
}
return dp[target][60]; // 找零6角对应dp数组下标60
}
int main() {
vector<int> coins = {1, 5, 10}; // 1角、5角、1元硬币
int target = 26; // 2元6角
cout << "共有 " << coinChange(coins, target) << " 种组合方式." << endl;
return 0;
}
```
这个代码首先初始化了一个动态规划表,然后通过遍历每种可能的金额和找零情况,更新组合数。最后返回目标金额下的组合数即可。
阅读全文