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;
}
现在有价值为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;
}
相关文章推荐
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟
- HDU 1000
- HDU 1001
- 2015-11-11 hdu新生赛 A题(AC)
- 2015-11-11 hdu新生赛 C题(结束后一发AC)
- 2015-11-11 hdu新生赛 E题(结束后一发AC)
- 2015-11-11 hdu新生赛 F题(结束后一发AC)
- hdu-5385