UVA 647 Coin Change

这道题不是我做出来的:但是方法很值得学习,首先通过这种方法我才知道在线oj判题的时候不是一个数据一个数据的而是一个文件一组,也就是判断程序运行时间的输入不是一个数据而是一组数据,所以本题采用了打表法。因为用正常的思路复杂度接近O(n3),时间接近三秒,而用打表法只需运行一遍算出7489种状态,再输入时只需调用即可,时间为0.03s左右:

代码如下:

#include<stdio.h>
#include<string.h>
#define MAXN 8000
int n;
int V[5], f[MAXN];
void prepare()
{
int i, j;
n = 7489;
memset(f, 0, sizeof(f));
f[0] = 1;
for(i = 1; i <=5; i ++)
for(j = V[i]; j <= n; j ++)
f[j] += f[j - V[i]];
}
void input()
{
prepare();
while(scanf("%d",&n) == 1)
{
printf("%d\n", f[n]);
}
}
int main()
{
V[1] = 1; V[2] = 5; V[3] = 10; V[4] = 25; V[5] = 50;
input();
return 0;
}



posted on 2012-03-10 10:40  BFP  阅读(249)  评论(0编辑  收藏  举报