给定 N 个范围.有多少种方法可以从这些范围中获取 N 个数字,这些数字的总和达到某个值

Given N ranges. How many ways are there to take N numbers from these ranges that sums up to a certain value?

本文关键字:数字 范围 方法 多少 给定 获取      更新时间:2023-10-16

让我们有 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),以便它们的总和为 cf(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),因此运行时不会太大。我怀疑有更好的方法来解决这个问题,通过做组合数学。