HDU 1284 钱币兑换问题

 

钱币兑换问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3484    Accepted Submission(s): 1964


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

 

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

 

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

 

Sample Input
2934 12553
 
Sample Output
718831 13137761
 
此题可以看成完全背包问题。背包容量为N,物品的花费分别为1,2,3。然而此题不是要求最大价值,而是求填满背包的总方案数。
 
 
代码1(二维完全背包:f[i][j]=sum(f[i-1][j],f[i][j-val[i]])):
 
 1 #include<iostream>
 2 using namespace std;
 3 
 4 int f[4][33333],val[4]={0,1,2,3};
 5 
 6 int sum(int a,int b){
 7     return a+b;
 8 }
 9 
10 int main()
11 {
12     int i,j,n;
13     for(i=1;i<32768;i++)
14         f[0][i]=0;
15     f[0][0]=1;
16     for(i=1;i<=3;i++){
17         for(j=0;j<val[i];j++)
18             f[i][j]=f[i-1][j];
19         for(j=i;j<32768;j++)
20             f[i][j]=sum(f[i-1][j],f[i][j-val[i]]);//可以直接写成f[i][j]=f[i-1][j]+f[i][j-val[i]],这样写只是突出背包的思想;
21     }
22     while(scanf("%d",&n)==1)
23         printf("%d\n",f[3][n]);
24     return 0;
25 }

 

 
代码2(一维完全背包:f[j]=sum(f[j],f[j-val[i]])):
 
 1 #include<iostream>
 2 using namespace std;
 3 
 4 int f[33333],val[4]={0,1,2,3};
 5 
 6 int sum(int a,int b){
 7     return a+b;
 8 }
 9 
10 int main()
11 {
12     int i,j,n;
13     f[0]=1;
14     for(i=1;i<=3;i++)
15         for(j=i;j<32768;j++)
16             f[j]=sum(f[j],f[j-val[i]]);//可以直接写成f[j]+=f[j-val[i]],这样写只是突出背包的思想;
17     while(scanf("%d",&n)==1)
18         printf("%d\n",f[n]);
19     return 0;
20 }

 

 

posted on 2013-03-04 13:21  Acmer_Roney  阅读(790)  评论(0编辑  收藏  举报

导航