您的位置:首页 > 其它

UVa 674 - Coin Change

2013-06-09 18:26 393 查看
/*
对于值6, 方案1、5 等效 5、1, 即硬币可以是无序的,所以必须增加一个维度让其有序。
d[i][j] : 表示使用了硬币1-i(i必使用了)组成j值的方案数
*/
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int TYPE = 6;
const int MAXN = 7500;
int coins[TYPE] = {0, 1, 5, 10, 25, 50};
int n;
int d[TYPE][MAXN];

void dp()
{
d[0][0] = 1;
for(int i=1; i<TYPE; i++) {
for(int j=1; j<=n; j++) {
for(int k=0; k<=i && j>=coins[i]; k++) {
d[i][j] += d[k][j-coins[i]];
}
}
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
n = MAXN - 2;
dp();
while(scanf("%d", &n) == 1) {
//printf("%d", n);
int s = 0;
for(int i=1; i<TYPE; i++) {
s += d[i]
;
}
printf("%d\n", s);
}
return 0;
}


/*
优化:使用一维的滚动数组
*/
#include <cstdio>
using namespace std;
const int TYPE = 5;
const int MAXN = 7500;
int coins[TYPE] = {1, 5, 10, 25, 50};
int n;
int d[MAXN];

int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
d[0] = 1;
for(int i=0; i<TYPE; i++) {
for(int j=1; j<MAXN-1; j++) {
if(j>=coins[i]) d[j] += d[j-coins[i]];
}
}
while(scanf("%d", &n) == 1) {
printf("%d\n", d
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: