UVa 674.Coin Change

来源:互联网 发布:java rpc http 编辑:程序博客网 时间:2024/06/05 12:45

经典dp问题,用记忆化搜索或者用递推(滚动数组)均可实现。

 

用滚动数组如下:

#include <iostream>#include <cstdio>using namespace std;int n;int f[7490];int a[5]={1,5,10,25,50};int main(){    int i,j;    for(i=0;i<7490;i++)f[i]=1;      //只由1组成均只有1种    for(i=1;i<5;i++)        for(j=a[i];j<7490;j++)            f[j]+=f[j-a[i]];    while( scanf("%d",&n)==1)        printf("%d\n",f[n]);    return 0;}


 

用记忆化搜索如下:

#include <iostream>#include<cstdio>#include<string.h>using namespace std;#define maxn 7490const int coin[]={0,1,5,10,25,50};int n,d[maxn][6];int dp(int s,int k){    if(d[s][k]!=-1) return d[s][k];    d[s][k]=0;int i;    for(i=k;i<=5&&s>=coin[i];i++)      d[s][k]+=dp(s-coin[i],i);    return d[s][k];}int main(){    memset(d,-1,sizeof(d));int i;    for(i=0;i<=5;i++) d[0][i]=1;    while(scanf("%ld",&n)==1)      printf("%d\n",dp(n,1));    return 0;}