写了很久都一直不是很理解,所以写个解题报告加深印象。

这道题是一道完全背包的题目,不同点在于求的是组合数而不是最大值。

题目: 在一个国家仅有1分,2分,3分硬币,将钱N (N<32768) 兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。

输入: 每行只有一个正整数N,N小于32768。

输出: 对应每个输入,输出兑换方法数。


分析:
完全背包问题,设有i种钱币,给出钱n(其中n可以理解为完全背包中的背包容量,i可以理解为物品的种数)
完全背包的状态转移方程为:dp[i][j]=max(dp[i-1][j],dp[i][j-weigh])
通过状态转移方程可以看出,算的是最优解,即背包能装的最大价值,但是在这道题中要求的是多少种组合,所以需要修改以下:
dp[i][j]=dp[i-1][j]+dp[i][j-1]
(假设i=3,那么前者就表示不用面值为3的钱币组成钱n的组合种数,后者表示使用面值为3的钱币组成钱n的组合种数,两者相加得到最终钱n的所有组合数。)

代码1(采用二维数组,不压缩数组):

#include<iostream>
#include<cstring>
using namespace std;
int dp[4][40000];
int main()
{int n,i,j;memset(dp,0,sizeof(dp));dp[0][0]=1;//二维数组看作一个表格,当面值和所给钱币都是0时,种数为1for(i=1;i<=3;i++){for(j=0;j<37000;j++){dp[i][j]=dp[i][j-i]+dp[i-1][j];//j-i表示的是少一个面值为i的硬币后具有的所有组合}}while(scanf("%d",&n)!=EOF){printf("%d\n",dp[3][n]);}
}

举个例子:假设钱n=7,那么7的所有组合情况为:
1、只有面值为1时,只有1种。
2、当有面值1和2时,dp[i-1][j]表示只有1的情况,dp[i][j-i] 表示含有面值为2的硬币时钱n-i的组合数,那么再加上一个i后,组合种数是不变的。
3、当有面值为1、2、3的硬币时,dp[i-1]表示的是含有1、2面值的硬币的组合数,dp[i][j-i]同理,表示的是含有面值为3的硬币的组合数。
结合上面三种情况,那么总组合数dp[i][j]为=dp[i][j-i]+dp[i-1][j]

代码2(压缩二维数组为一维数组):

#include<iostream>
#include<cstring>
using namespace std;
int dp[40000];
int main()
{int n,i,j;memset(dp,0,sizeof(dp));dp[0]=1;//同理,当给的钱n为0时,只有一种组合for(i=1;i<=3;i++){for(j=i;j<37000;j++){dp[j]=dp[j-i]+dp[j];}}while(scanf("%d",&n)!=EOF){printf("%d\n",dp[n]);}
}

钱币兑换(动态规划)相关推荐

  1. 动态规划之钱币兑换问题

    钱币兑换问题 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法. Input 每行只有一个正整数N,N小于32768. Output 对应每个输入,输出 ...

  2. HDU 1284 钱币兑换问题 (动态规划 背包方案数)

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 钞票兑换java编程题,HDOJ 题目1284钱币兑换问题(动态规划,完全背包) | 学步园...

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. 钱币兑换问题c语言编程,HDU 1284 钱币兑换问题

    题目: 钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  5. HDU 1284 钱币兑换问题 (完全背包)

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  6. HDU1284——钱币兑换问题【dp】

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  7. hdu1284经典钱币兑换问题

    钱币兑换问题. 题目 http://acm.hdu.edu.cn/showproblem.php?pid=1284 完全背包. 这种是求背包问题最多的组合方案 参考了一些资料   http://blo ...

  8. hdu 1284 钱币兑换问题

    hdu 1284 钱币兑换问题 母函数 //hdu 1284 母函数// 1分的 2分的 3分的 //母函数计算:(1+x+x^2+x^3+...)*(1+x^2+x^4+...)*(1+x^3+x^ ...

  9. 【算法】求解钱币兑换问题

    求解钱币兑换问题 某个国家仅有1分.2分和5分硬币,将钱n(n≥5)兑换成硬币有很多种兑法.编写一 个实验程序计算出10分钱有多少种兑法,并列出每种兑换方式. #include<iostream ...

  10. hdu 1284钱币兑换问题

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

最新文章

  1. 前端技术学习之选择器(一)
  2. linux awk命令
  3. 又一联盟成立:清华、北大、深大、南科大、哈工大等12家在深单位加盟
  4. sqlserver 多排序的问题
  5. WARN [com.mchange.v2.async.ThreadPoolAsynchronousRunner] - com.mchange.v2.as
  6. python histo 改变 bins 大小_子批次大小python
  7. vue中如何创建组件?
  8. Enze frist day
  9. java与C++变量类型对应表
  10. Android技巧:003使用Intent连接多个活动
  11. 全网可达,交换机和路由器的配置,vlan
  12. ① 数据库介绍 及 关系型数据库的关系代数表达式
  13. 从企业实务角度解读 ITIL4 之14个通用管理实践
  14. umail for linux,umail for linux邮件服务器备份与还原
  15. Obama's speech in Chicago
  16. UE4球体根据镜头方向前进
  17. 设置网络唤醒电脑(WAKE ON LAN,WOL)
  18. 2021-2027全球与中国便携式超高清摄像头市场现状及未来发展趋势
  19. python画中国人口变化情况以及数据拟合
  20. python抢票软件代码_Python抢票程序优化,可以选择车次和座次

热门文章

  1. 矩阵乘法的并行化算法讨论
  2. 【swust.oj_1088】我们的征途是星辰大海
  3. icordova拍照_ionic2/3实战-添加拍照功能cordova-plugin-camera
  4. 基于模板匹配的目标跟踪法
  5. Advanced Installer轻松带你入门
  6. Caused by: java.lang.NoClassDefFoundError: org/apache/curator/shaded/com/google/common/collect/Maps
  7. 探究break到底是跳出几层循环。
  8. 关于青春的电影有哪些
  9. PS/2接口鼠标滚轮不能用的解决办法
  10. SDWU 2021 Autumn Training Series C1 1st Round题解