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
原创粉丝点击