您的位置:首页 > 其它

hdu(2069)——Coin Change

2016-01-28 23:18 375 查看
题意:

现在有价值为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 300
int 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
[i];
}
printf("%I64d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息