给定 N 个范围.有多少种方法可以从这些范围中获取 N 个数字,这些数字的总和达到某个值
Given N ranges. How many ways are there to take N numbers from these ranges that sums up to a certain value?
让我们有 N 个范围 [ L , R ]。我们必须从这些 N 个范围中取出 N 个数字,这些数字的总和等于某个值 C。我需要找到多少种方法,当然我们可以用 MOD 值(例如 109+7)来做到这一点?
例如, 让我们有 3 范围 .我必须使C = 10。
2 5
3 4
2 4
所以总共有24种组合。总共有 6 种方法可以制作 10 .即 [2,4,4]、[3,3,4]、[3,4,3]、[4,3,3]、[4,4,2]、[5,3,2]。
约束:
0 < N <=110
0 < L, R <=50000
任何帮助将不胜感激。
提前谢谢。
确实有一个简单的使用动态编程的方法。给定N
范围[L(1),R(1)], [L(2), R(2)], ..., [L(N),R(N)]
,我们可以计算在前i
范围中的每一个中选择一个整数的可能性的数量f(i,c)
,以便它们的总和为 c
。f(0,c)
的值非常明显:
f(0,0) = 1
f(0,c) = 0 (for all c besides 0)
对于f(i+1,c)
假设L(i+1) <= x <= R(i+1)
是我们从第 i+1
个列表中选择的值。然后f(i,c-x)
可以从前i
列表中选择值,因此总和c
。将所有可能的x
选择相加,可以得到:
f(i+1,c) = f(i, c-L(i+1)) + f(i, c-L(i+1)+1) + ... + f(i, c-R(i+1))
然后f(N,C)
是您正在寻找的数字。
请注意,使用这种方法,您需要f(i,c)
计算大约N*C
个数字,并且需要对大约R(i)-L(i)
数字求和以计算一些f(i,c)
,因此运行时不会太大。我怀疑有更好的方法来解决这个问题,通过做组合数学。
相关文章:
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 如何从适合一定范围的数字中提取数字?
- 如何使用count_if计算向量中的可变数字范围
- 从(排序的)数字列表中获取数字范围
- 我应该如何使用remove_if删除两个数字范围内的元素
- 计算数字范围内特定数字的出现次数
- 编程:原理与实践 使用C++ 第 4 章演练步骤 6:关于数字范围的一般问题
- 从排序的数字数组中返回数字范围的最快方法是什么?
- 操作员支持的数字范围
- 数组中最常见的数字范围
- 数字范围和显示数字重复c++
- 如何更改数字范围的起始限制
- 从字符串中提取数字/数字范围的复杂算法
- 数字范围超过 40 时出现堆栈溢出错误
- 如何检查两个数字是否在浮点类型的精度限制的有效数字"x"范围内?
- 测试检查该方法返回一个数字范围
- 删除单链表中特定数字范围之外的节点
- 无法在C++中增加程序中的数字范围
- 以将阵列中的数字范围映射为均匀随机1到100
- 在 C/C++ 中定义数字范围