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 阅读(795) 评论(0) 编辑 收藏 举报