题意:有5种硬币, 面值分别为1、5、10、25、50,现在给出金额,问可以用多少种方式组成该面值。
思路:前两 天刚看到背包九讲中关于如何求完全背包求方案数的知识,转眼就又忘了。
背包九讲:
对于一个给定了背包容量、物品费用、物品间相互关系(分组、依赖等) 的背包问题,除了再给定每个物品的价值后求可得到的最大价值外,还可以得 到装满背包或将背包装至某一指定容量的方案总数。 对于这类改变问法的问题,一般只需将状态转移方程中的max改成sum即 可。例如若每件物品均是完全背包中的物品,转移方程即为
F[i,v] = sumF[i−1,v],F[i,v−Ci]
初始条件是F[0,0] = 1。
事实上,这样做可行的原因在于状态转移方程已经考察了所有可能的背包 组成方案。
这题就和这个描述特别像,将所求的面额看成背包体积,5种硬币看成5种物品,这不就是一个裸题。。。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int dp[7500];//dp[i]表示面额为i时的交换方法数
int coin[] = {1, 5, 10, 25, 50};
int main() {
dp[0] = 1;
for(int i = 0; i < 5; i++) {
for(int j = coin[i]; j <= 7500; j++) {
dp[j] = dp[j] + dp[j - coin[i]];
}
}
int n;
while(~scanf("%d",&n)) printf("%d\n",dp[n]);
return 0;
}
本文介绍了一道关于使用不同面值硬币组合成特定金额的问题,并通过完全背包问题的解决方案来解答此问题。利用动态规划的方法,通过C++代码实现了一个简单的程序来计算可能的组合数量。
516

被折叠的 条评论
为什么被折叠?



