hduoj 1284详细解题,推荐
来源:互联网 发布:mac finder 打开路径 编辑:程序博客网 时间:2024/04/28 01:33
钱币兑换问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9358 Accepted Submission(s): 5710
Problem Description
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
Input
每行只有一个正整数N,N小于32768。
Output
对应每个输入,输出兑换方法数。
Sample Input
293412553
Sample Output
71883113137761题解:这里觉得有必要写一下详细的题解,因为这个完全包太太经典了。先来看完全背包解法:设dp[i]表示钱币为i时的方案数。1,2,3三种钱可以看作是它放进背包时占据的空间大小。因为钱增加的时候方案数肯定增加,所以无须转移。比如当x=1的情况,dp[i=1...n]存的就是全部用1的方案数,也就是1.x=2时,dp[i=2...n]存放的就是将其中每两个1换成2,且2的个数不同时的方案数。x=3同理。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;long long int dp[33333];int main(){ int n,m; dp[0] = 1; for(int i = 1;i <= 3;i++) { for(int j = i;j < 33333;j++) { dp[j] += dp[j-i]; } } while(cin >> n) { cout << dp[n] << endl; } return 0;}另一种直接数个数的方法:算出最多可以放多少个3.再把3换成2,方案数相加:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){ int n,m; while(cin >> n) { int three = n/3+1;//算出只用3和1的方案个数。比如9=3*3;依次将每个3全换成1,有四种 for(int i = 0;i <= n/3;i++) { int two = (n-3*i)/2;//总数减去用去的3的个数,剩下的钱数/2就是在3和1的基础上加上2的方案个数,或者理解为把3换成1和20 three += two; } cout << three << endl; } return 0;}
0 0
- hduoj 1284详细解题,推荐
- hduoj题目详细分类
- HDUOJ Knight Moves解题报告
- HDUOJ
- HDUoj
- 解题报告: 商品推荐走马灯
- GitHub超详细推荐
- hdu1501-poj2192详细解题报告
- poj3669解题报告(详细)
- [汇总]字符串题目推荐及解题报告
- 汇总]搜索题目推荐及解题报告
- [汇总]字符串题目推荐及解题报告
- [汇总]字符串题目推荐及解题报告
- 搜索题目推荐及解题报告(转)
- 字符串题目推荐及解题报告
- 搜索题目推荐及解题报告
- 搜索题目推荐及解题报告
- 搜索题目推荐及解题报告
- 如何建立自信心
- Java通过JDBC 进行Dao层的封装
- MQTT客户端JAVA代码----fusesource mqtt-client
- Trie树 字典树 模板
- AdaBoost算法详解
- hduoj 1284详细解题,推荐
- 如何查看JSTL中自带的TLD文件
- 【VSCode】Windows下VSCode编译调试c/c++
- 《恋狱》
- 实现文件的读写操作举例
- 重修Java——运算符
- 5秒让你的View变3D,ThreeDLayout使用和实现
- 英文名字的昵称(亲切的叫法)
- 杭电oj编码2013