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;
}
题解:用了之前一直用的递归方法超时,因为每次都要预处理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 11137(硬币dp)
- 解题报告(一):uva 10313 - Pay the Price (dp)
- UVa 10313 Pay the Price (DP&整数拆分)
- uva 10328 - Coin Toss 投硬币(dp递推,大数)
- 【解题报告】uva674_Coin Change(硬币找零, dp, 完全背包)
- UVA 11137 Ingenuous Cubrency 类似硬币问题的简单dp
- uva 10313 Pay the Price (DP)
- UVA 562 (用硬币拼数额 DP 14.3.11)
- uva10626(硬币DP)
- Coin Change - UVa 674 换硬币的dp
- uva 10313 整数拆分——硬币凑价
- 小白dp uva 10313 - Pay the Price (ferrari 图+ 背包)
- e-Coins+uva+分硬币dp
- UVALive 6661 - Equal Sum Sets (类似硬币的DP问题)
- UVA 674 Coin Change 换硬币 经典dp入门题
- UVA 357 (硬币拼数额 DP 14.3.10)
- dp(整数拆分 uva10313 - Pay the Price)
- UVA 674 Coin Change 换硬币 经典dp入门题
- uva10313(DP完全背包)
- HDU 2069 & UVA 674 Coin Change(换硬币 dp 入门经典水题,背包问题)