钱币兑换问题
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 49 Accepted Submission(s) : 34
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
Input
每行只有一个正整数N,N小于32768。
Output
对应每个输入,输出兑换方法数。
Sample Input
2934 12553
Sample Output
718831
13137761
因为是多重背包问题拆数字的最多拆法,所以可以用母函数(需要打表差点超时。。)
多重背包做的话就和上面的Dividing那题差不多,只不过这里只能用1 2 3这三个数字去凑
母函数
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
long long int a1[55555];
long long int a2[55555];
int n;
int i,j,k;
a1[0]=1;
a2[0]=0;
for(i=1;i<=32800;i++)
{
a1[i]=1;
a2[i]=0;
}
for(i=2;i<=3;i++)
{
for(j=0;j<=32800;j++)
for(k=0;k+j<=32800;k+=i)
{
a2[k+j]+=a1[j];
}
for(int s=0;s<=32800;s++)
{
a1[s]=a2[s];
a2[s]=0;
}
}
while(cin>>n)
{
cout<<a1[n]<<endl;
}
return 0;
}
背包
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
long long int dp[35555];
dp[0]=1;
int i,j;
int n;
for(i=1;i<=3;i++)
{
for(j=1;j<=32800;j++)
dp[j]+=dp[j-i];
}
while(cin>>n)
{
cout<<dp[n]<<endl;
}
return 0;
}