您的位置:首页 > 其它

uva 10313(硬币dp)

2014-12-16 20:08 363 查看
题意:给出一个n,从1到n的不同面值的硬币不限数量有多少方式凑成n,如果又给出一个l1,代表用小于等于l1数量的从1到n面值的硬币有多少方式凑成n,如果又给了l2代表数量大于等于l1小于等于l2数量的从1到n面值的硬币有多少种方式组成n。

题解:用了之前一直用的递归方法超时,因为每次都要预处理f[i][j]数组(f[i][j]代表面值不超过j凑成i的方案数)。递推+打表,用不超过j个硬币凑出面值i的方案种数,是和用面值不超过j的硬币凑出面值i的方案种数是相同的。(此结论网上得知。。) f[i][j] += f[i - j][j] + f[i][j - 1] (使用面值j和不使用面值j)。

#include <stdio.h>
#include <string.h>
const int N = 305;
int n, l1, l2;
char str[100];
long long f

;

int main() {
f[0][0] = 1;
for (int i = 0; i <= 300; i++)
for (int j = 1; j <= 300; j++) {
if (i >= j)
f[i][j] += f[i - j][j];
if (j >= 1)
f[i][j] += f[i][j - 1];
}
while (gets(str)) {
int a = sscanf(str, "%d%d%d", &n, &l1, &l2);
l1 = l1 < 300 ? l1 : 300;
l2 = l2 < 300 ? l2 : 300;
if (a == 1)
printf("%lld\n", f

);
else if (a == 2)
printf("%lld\n", f
[l1]);
else
printf("%lld\n", f
[l2] - f
[l1 - 1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva dp