uva 10313(硬币dp)

题意:给出一个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[N][N];

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[n][n]);
		else if (a == 2)
			printf("%lld\n", f[n][l1]);
		else
			printf("%lld\n", f[n][l2] - f[n][l1 - 1]);
	}
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值