Problem Description
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
Input
每行只有一个正整数N,N小于32768。
Output
对应每个输入,输出兑换方法数。
Sample Input
2934
12553
Sample Output
718831
13137761
解题思路:
很经典的母函数问题,当然也可以用完全背包。
因为数值比较大,所以打表,不然会超时。
代码:
//母函数+打表
#include <cstdio>
#include <cstring>
using namespace std;
long long ways[33000] , temp[33000];
void getWays(){ //打表
int i , j , k;
memset(ways , 0 , sizeof(ways));
memset(temp , 0 , sizeof(temp));
for(i = 0 ; i <= 32768 ; i ++)
ways[i] = 1;
for(i = 2 ; i <= 3 ; i ++){
for(j = 0 ; j <= 32768 ; j ++){
for(k = 0 ; k + j <= 32768 ; k = k + i){
temp[k + j] = temp[k + j] + ways[j];
}
}
for(j = 0 ; j <= 32768 ; j ++){
ways[j] = temp[j];
temp[j] = 0;
}
}
}
int main(){
getWays()
int n;
while(scanf("%d",&n) != EOF){
printf("%lld\n",ways[n]);
}
return 0;
}