题目:
钱币兑换问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7644 Accepted Submission(s): 4535
Problem Description
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
Input
每行只有一个正整数N,N小于32768。
Output
对应每个输入,输出兑换方法数。
Sample Input
2934
12553
Sample Output
718831
13137761
思路:
这题一看就是学c语言百钱买百鸡的问题,所以我的代码是这样的。
代码:
#include
#include"string.h"
#include"cstdio"
#include"stdlib.h"
#include"algorithm"
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int ans=0;
for(int i=0;i<=n/3;i++)
{
for(int j=0;j<=(n-3*i)/2;j++)
{
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
思路:
当然,这里也可以用动态规划来解。
假如我现在容量为100块,这100块用面值为1和2的有1000种方法,那么我现在引入3元的货币,那么这100块可以拆分成97元和3元,引入的3元只有一种方法,所以会多1*dp[97]种方法,就是这里的转移方程:
dp[j]=dp[j]+dp[j-weight[i]];
每种容量的方法总数等于未引入新货币的方法总数+引入之后剩下的货币的方法总数。
代码:
#include
#include"string.h"
#include"cstdio"
#include"stdlib.h"
#include"algorithm"
using namespace std;
int n;
int dp[33000];
int weight[5]={0,1,2,3};
int value[5]={0,1,2,3};
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=3;i++)
{
for(int j=weight[i];j<=n;j++)
{
dp[j]=dp[j]+dp[j-weight[i]];
}
}
printf("%d\n",dp[n]);
}
return 0;
}