C++ 兑换零钱问题:300元用10元、5元、1元兑换,每种面额都是偶数张,有多少种方法?
这是一个经典的硬币找零问题,可以用动态规划算法求解。
设dp[i][j][k][l]表示使用前i种面额,总共兑换j元,10元使用k张,5元使用l张的方案数。
边界条件为:dp[0][0][0][0]=1,表示不使用任何面额,兑换0元,不使用任何硬币的方案数为1。
状态转移方程为:
dp[i][j][k][l] = dp[i-1][j][k][l] //不使用第i种面额 + dp[i][j-10i][k-1][l] //使用1张第i种面额和k-1张10元的方案 + dp[i][j-5i][k][l-1] //使用1张第i种面额和l-1张5元的方案 + dp[i][j-i][k][l] //使用2张第i种面额的方案
最终答案为dp[3][300][2][2],即使用前3种面额,总共兑换300元,10元使用2张,5元使用2张的方案数。
C++代码如下:
#include <iostream>
using namespace std;
int dp[4][301][3][3];
int main() {
//初始化边界条件
dp[0][0][0][0] = 1;
for(int i=1; i<=3; i++) {
for(int j=0; j<=300; j++) {
for(int k=0; k<=2; k++) {
for(int l=0; l<=2; l++) {
//不使用第i种面额
dp[i][j][k][l] += dp[i-1][j][k][l];
//使用1张第i种面额和k-1张10元的方案
if(j>=10*i && k>=1) dp[i][j][k][l] += dp[i][j-10*i][k-1][l];
//使用1张第i种面额和l-1张5元的方案
if(j>=5*i && l>=1) dp[i][j][k][l] += dp[i][j-5*i][k][l-1];
//使用2张第i种面额的方案
if(j>=2*i) dp[i][j][k][l] += dp[i][j-i][k][l];
}
}
}
}
cout << dp[3][300][2][2] << endl;
return 0;
}
原文地址: http://www.cveoy.top/t/topic/nuUK 著作权归作者所有。请勿转载和采集!