- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道如果我在范围内寻找排列,是否有一种算法可以告诉我会得到多少结果。
我有一个寻找组合的程序。最好的解释方法是举个例子,假设你有 4 种商品要在商店购买:苹果、桃子、梨和橙子。你想知道你能把每一个放入一个篮子里的百分比是多少,但你告诉自己你想要一分钟。每个项目 20 个,每个项目最多 60 个(因此 apple:25、peach:25、pear:25 和 orange:25 完美但不是 apple:0、peach:0、pear:50 和 orange: 50,因为我们将最小值设置为 25)。如果您运行此示例,则返回的正确项目数为 1771。
有没有办法提前计算这个而不是运行实际的程序?我有一个程序需要进行预测,我正在尝试找到理想的组合,所以我想编写一个程序来提供正确的输出,然后我将对输入进行蒙特卡洛模拟以找到混合我喜欢的项目/范围。
这是我使用的程序(它适用于我从未使用过最高频段的情况,但如果范围更窄,1-4 则它不起作用,因为它在不考虑范围的情况下为我提供了组合):
import math
def nCr(n,r):
f = math.factorial
return f(n) / f(r) / f(n-r)
if __name__ == '__main__':
print nCr(20+4-1,20) #percent+buckets(items)-1, percent
这给了我正确的答案(1771),因为它不需要考虑最大值(60),因为它从未达到(它只使用 20 作为输入)。但是有没有一种方法可以修改这个公式(或使用其他方法)来告诉我如果我有 40 个范围为 2-5 的项目或其他东西(最大值为好吧)。
是否有一种算法可以满足我的要求?
最佳答案
你可以用包含排除原则找到这个数字。设 distributions(itemCount,bucketCount)
是 itemCount
项目到 bucketCount
桶的无限制分布的数量。我忽略了下限,因为只需减去 bucketCount*lowerLimit
项即可解决这个问题。
将itemCount
项分发到bucketCount
个桶中且每个桶最多包含upperLimit
个项的方法数是无限制分发的次数减去至少一个桶包含超过 upperLimit
项目的不受限制分布的数量。后者可以用包含排除原则计算如下:
有 bucketCount
个选择的桶至少包含 upperLimit+1
个项目,还有 itemCount - (upperLimit+1)
项目分发到 bucketCount
桶:
bucketCount * distributions(itemCount - (upperLimit+1), bucketCount)
必须从无限制分发的数量中减去。
但是我们已经两次减去两个桶包含超过 upperLimit
个项目的分布,我们必须更正它并添加
nCr(bucketCount,2) * distributions(itemCount - 2*(upperLimit+1), bucketCount)
同样,因为有两个桶的nCr(bucketCount,2)
选择。
但是我们已经三次减去三个桶包含超过 upperLimit
项目的分布,并再次添加三次 (nCr(3,2)
),所以我们必须减去
nCr(bucketCount,3) * distributions(itemCount - 3*(upperLimit+1), bucketCount)
纠正这一点。等等
总而言之,数是
m
∑ (-1)^k * nCr(bucketCount,k) * distributions(itemCount - k*(upperLimit+1), bucketCount)
k=0
在哪里
m = min { bucketCount, floor(itemCount/(upperLimit+1)) }
(因为无法分发负数的项目)。
通过实现函数来更正要点中的代码,以计算根据下限和上限分配项目的方式:
import math
def nCr(n,r):
f = math.factorial
return f(n) / f(r) / f(n-r)
def itemCount_cal(target, items, minValue):
return target- items*minValue
def distributions(itemCount, bucketCount):
# There's one way to distribute 0 items to any number of buckets: all get 0 items
if itemCount == 0:
return 1
# we can't distribute fewer than 0 items, and we need at least one bucket
if itemCount < 0 or bucketCount < 1:
return 0
# If there's only one bucket, there's only one way
if bucketCount == 1:
return 1
#get all possible solutions
# The number of ways to distribute n items to b buckets is
# nCr(n+b-1,n)
f = math.factorial
return f(itemCount + bucketCount-1)/(f(itemCount) * f(bucketCount-1))
def ways(items,buckets,lower,upper):
if upper < lower: # upper limit smaller than lower: impossible
return 0
if buckets*upper < items: # too many items: impossible
return 0
necessary = buckets*lower
if items == necessary: # just enough items to meet the minimum requirement
return 1
if items < necessary: # too few items: impossible
return 0
# put the minimum required number in each bucket, leaving
# items - necessary
# to distribute
left = items - necessary
# We have put 'lower' items in each bucket, so each bucket can now take
# at most (upper - lower) more
# any more, and the bucket is overfull
over = upper + 1 - lower
# maximal number of buckets we can put more than upper in at all
# after we fulfilled the minimum requirement
m = left // over
# We start with the number of ways to distribute the items disregarding
# the upper limit
ws = distributions(left,buckets)
# Sign for inclusion-exclusion, (-1)**k
sign = -1
# Number of overfull buckets
k = 1
while k <= m:
# Add or subtract the number of ways to distribute
# 'left' items to 'buckets' buckets with
# k buckets overfull
#
# nCr(buckets,k) choices of the buckets we overfill at the start
#
# That leaves (left - k*over) items to distribute.
ws += sign * nCr(buckets,k) * distributions(left - k*over,buckets)
# flip sign and increment number of overfull buckets
sign = -sign
k += 1
return ws
请注意,对于大量的项目和桶,使用阶乘计算 nCr
并不是最好的方法,它会导致大量的中间结果并使用不必要的操作。
关于使用边界查找预测数量的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10802555/
我在 GlassFish (J2EE_1.4) 上的 NetBeans 中开发企业项目。我的项目中有一些实体 bean、一些 session bean 和消息驱动 bean。我以如下方式使用 serv
什么在速度方面更好...... 我正在尝试确定用户是否已将某个 URL 添加到他们的快捷方式列表中。如果他们添加了 URL,页面上就会有一个链接,用于从快捷方式中删除该页面,否则他们可以将其添加到快捷
我的问题如下: 我打开一个Excel-File,但我不知道我的客户在模板文件中使用了哪些可能的标头变量。它们可以是:#DATE,#TIME,#NAME等。因此,我需要查找这些变量,以及是否已使用过:替
我有一堆以“-e”结尾的文件要删除。 $ find . -name "*-e" exec rm {} \; find: exec: unknown primary or operator 正则表达式是
我有一个简单的问题:是否可以在 TypeScript 中获取联合的一部分的类型? 例如,您可以经常使用如下查找类型: interface Person { name: string; } type
我正在尝试设置 Point Cloud Library启用 CUDA 选项的主干构建。 我相信我已经按照 these instructions 正确安装了 CUDA . 在 PCL 构建的 cmake
我将首先说我所知道的唯一 VBA 是操作录制的宏的反复试验。我是一名注册会计师,试图以艰难的方式学习 VBA(并希望我去学校学习计算机编程!)。 我有带有多个工作表的大型工作簿。 G 列中以黄色突出显
当文件数达到阈值时,我试图删除目录中最旧的文件。 list_of_files = os.listdir('log') if len([name for name in list_of_files
我有一个数组,它有一些重复的值。 我必须计算每个重复项的数量及其索引。 打印如: Index of b: 1 Index of b: 4 Index of c: 2 Index of c: 3 Ind
我已经搜索了我的问题的解决方案,但没有成功。热键 ctrl+F 找到的 eclipse 查找/替换功能不起作用。注意:通过 Eclipse 菜单 Edit>Find Replace(不工作我的意思是
我想检查 div 是否包含类为“error”的子级,但条件是错误类显示不等于无。 (意味着错误类必须可见。 如何更改我的以下代码: $(".related_field").each(function
这个问题已经有答案了: 已关闭13 年前。 Possible Duplicate: Can jQuery provide the tag name? 嗨! 这个问题太基础了,我不好意思问,但我尝试了
我一直听说这是 cygwin 的路径问题。它阻止了 emacs 在我的 cygwin 中工作。当我在 cli(不是 bash/cygwin)上执行 find 时,无论我输入什么,我都会得到同样的错误。
我正在使用此变量来获取一个或多个与我需要的值相匹配的值。 var mail = $("#dat").contents().find("td:contains('" + name + "')" ).si
请原谅这个长问题。我只是不确定解决这个问题的最佳方法是什么。 我有一个电子表格(Google 表格),其中包含用户和地址列表,我需要从中创建邮寄标签。该电子表格是从我们的学生信息系统导出的。这些地址应
我正在 Excel VBA 中创建一个公式,以解析单元格中以逗号分隔的“部分”列表。在另一个工作表中查找具有该零件名称的单元格,然后使用找到的该单元格的地址来获取同一行不同列的零件成本。我为此工作了数
我被要求在网络应用程序上实现一些电子邮件地址验证 - 我确信我们都已经经历过一千次了...但是,这一次我被要求在域上进行 MX 查找查看它是否接受电子邮件。 有人知道这样做有任何潜在的问题吗? mx
我有一个切换按钮,可读取.wave文件,并且字符串更改为暂停,然后..... 我的问题是,当用户播放声音时,按钮字符串更改为暂停,结束声音后,该字符串仍为暂停状态,我想将其更改为播放。但是我不知道如何
对于令人困惑的标题提前表示歉意。我的问题如下,我在大约 600 个文件中有以下文本: $_REQUEST['FOO'] 我想将其替换为以下内容: $this->input->post('FOO') 为
我正在使用 Ansible 的查找功能查找 INI 文件中的值。这是文档中的示例: - debug: msg="User in integration is {{ lookup('ini', 'use
我是一名优秀的程序员,十分优秀!