hdu(2069)——Coin Change

来源:互联网 发布:千牛淘宝助手在哪里 编辑:程序博客网 时间:2024/04/30 05:03

题意:

现在有价值为n的硬币,然后你有1,5,10,25,50的小硬币。然后问你有多少种方法可以找回价值为n的硬币。注意最多只能使用100个硬币,然后当n=0时,输出只有一种方案。

思路:

因为这里最多只能使用100个硬币,所以我们需要增加一维来限制状态。因为第一维限制的是硬币的价值嘛。

所以设为c1[maxn][100],c2[maxn][100]。

唯一要注意的就是要多加一层for循环来控制硬币的数量嘛。

然后就好啦~~

#include<cstdio>#include<cstring>#include<map>#include<set>#include<cmath>#include<algorithm>#include<vector>#include<queue>#include<stack>#include<iostream>using namespace std;typedef __int64 ll;typedef unsigned __int64 ULL;#define inf 99999999#define maxn 300int v[7];ll c1[maxn][110],c2[maxn][110];int main(){    int n;    v[1]=1; v[2]=5; v[3]=10;     v[4]=25; v[5]=50;    while(~scanf("%d",&n)){        memset(c1,0,sizeof(c1));        memset(c2,0,sizeof(c2));        if(n==0){            printf("1\n");            continue;        }        for(int i=0;i<=100;i++){            c1[i][i]=1;        }        for(int i=2;i<=5;i++){            for(int j=0;j<=n;j++){                for(int k=0;k+j<=n;k+=v[i]){                    for(int l=0;l+(k/v[i])<=100;l++){                        c2[j+k][l+k/v[i]]+=c1[j][l];                    }                }            }            for(int j=0;j<=n;j++){                for(int l=0;l<=100;l++){                    c1[j][l]=c2[j][l];                    c2[j][l]=0;                }            }        }        ll ans=0;        for(int i=0;i<=100;i++){            ans+=c1[n][i];        }        printf("%I64d\n",ans);    }    return 0;}


0 0
原创粉丝点击