钱币兑换问题

\Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15976 Accepted Submission(s): 9546
**

Problem Description

在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。

Input

每行只有一个正整数N,N小于32768。

Output

对应每个输入,输出兑换方法数。

Sample Input

1
2
2934
12553

Sample Output

1
2
718831
13137761

Author

SmallBeer(CML)

Source

杭电ACM集训队训练赛(VII)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <stdio.h>
#include <vector>
#include <cstring>
#include <algorithm>
//相当于3件物品,容量为N的背包,第i件物品的重量是i
//初始化: dp[0][0]=1
//dp[i][j]表示用前i件物品组成j的方案数量
//dp[i][j]=sum{dp[i-1][j],dp[i][j-val[i]]}
//滚动数组优化:
//dp[j]=sum{dp[j],dp[j-val[i]]}
using namespace std;
int temp;
const int maxn=33000;//32468
long long int dp[maxn];
int main() {
//std::cout << "Hello, World!" << std::endl;
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1;i<=3;i++){
for(int j=i;j<maxn;j++){
dp[j]+=dp[j-i];
// printf("%lld\n",dp[j]);
// dp[j]+=max(dp[j],dp[j-i]);
}
}
// printf("here");
//
// scanf("%d",&temp);
// printf("%lld",dp[temp]);

while(scanf("%d",&temp)==1){
printf("%I64d\n",dp[temp]);
}

return 0;
}