uva Coin Change

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=615 

1
用dp[i][k]表示以k为最大值组成i需要多少种方法 2 那么答案ans=dp[i][50]+dp[i][25]+dp[i][10]+dp[i][5]+dp[i][1]; 3 用dfs()求dp[i][k]; 4 转移方程: 5 dp[i][k]=0 i<k||i<0 6 dp[i][k]= 求和dfs(i-k,x) 1<=x<=k; 7 8 9 10 #include<stdio.h> 11 #include<string.h> 12 const int maxn=8000; 13 int dp[maxn][6]; 14 int a[6]; 15 int dfs(int x,int k)//求解dp[i][k]; 16 { 17 18 if(x<=0||a[k]>x)return 0; 19 if(x==a[k]||a[k]==1) 20 { 21 dp[x][k]=1; 22 return dp[x][k]; 23 } 24 if(dp[x][k]>=0)return dp[x][k]; 25 int sum=0; 26 int m=x-a[k]; 27 for(int i=k;i<=5;i++)//求和 28 { 29 sum+=dfs(m,i); 30 } 31 dp[x][k]=sum; 32 return dp[x][k]; 33 } 34 int main() 35 { 36 int n; 37 a[1]=50; 38 a[2]=25; 39 a[3]=10; 40 a[4]=5; 41 a[5]=1; 42 43 memset(dp,-1,sizeof(dp)); 44 while(scanf("%d",&n)!=EOF) 45 { 46 if(n==0){printf("1\n");continue;} 47 int ans=dfs(n,1)+dfs(n,2)+dfs(n,3)+dfs(n,4)+dfs(n,5); 48 printf("%d\n",ans); 49 } 50 }

转载于:https://www.cnblogs.com/acSzz/archive/2012/06/23/2559194.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值