标签: combinatorics

有多少种方法来表示给定数字集中的一个数字

我想知道我们可以用多少种方式将数字 x 表示为给定数字集合 {a1.a2,a3,...} 中的数字之和。每个数字可以被多次取走。

\n\n

例如,如果x=4且a1=1,a2=2,则x=4的表示方式为:

\n\n
1+1+1+1\n1+1+2\n1+2+1\n2+1+1\n2+2\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此路数=5。

\n\n

我想知道是否存在一个公式或其他一些快速方法可以做到这一点。我无法用暴力破解它。我想为它编写代码。

\n\n

注意:x 可以大到 10^18。a1,a2,a3,\xe2\x80\xa6 的项数最多可达 15 个,并且 a1,a2,a3,\xe2\x80\xa6 中的每一项也最多只能达到 15 个。

\n

algorithm combinatorics

5
推荐指数
1
解决办法
4762
查看次数

从 n 个元素的集合中取出 k 个元素的乘积之和

给定一个S包含n元素的集合和一个整数k。我需要找到所有n选择对的乘积之和k。也就是说,如果S = {1,2,3,4} and k = 2,那么我正在寻找P = 1*2 + 1*3 + 1*4 + 2*3 + 2*4 +3*4。请注意,乘积对构成了集合——k从一组n元素中获取不同的元素。我可以制定一个简单的动态编程版本:

P(n,k) = a_{n}P(n-1,k-1) + P(n-1,k)
Run Code Online (Sandbox Code Playgroud)

也就是说,获取n-1元素并选择k-1、添加a_{n}和删除a_{n}。是否有一些不错的理论可以找到上述问题的封闭式解决方案?尽管编程让我兴奋,但我在高等数学方面有点欠缺。我能够推导出上述的 DP,但无法继续到我希望有的封闭形式!

dynamic-programming combinatorics discrete-mathematics polynomial-math

5
推荐指数
1
解决办法
1114
查看次数

找出总和可被 k 整除的对的数​​量?

给定 k 值。这样 k<=100000 我们必须打印对的数量,使得每对元素的总和可以被 k 整除。在以下条件下,第一个元素应该小于第二个,并且两个元素都应该小于 10 9

combinations numbers combinatorics

5
推荐指数
1
解决办法
7195
查看次数

依赖多图:具有重复边的图的拓扑排序和评估

我有一个依赖图,其中一个节点需要前一个节点的两个副本才能满足。我想使用拓扑排序来获得评估顺序,但问题是拓扑排序忽略了平行/多边,而只是将其视为一种依赖关系。我的建模是否错误,或者我是否需要一个适用于多重图的特定拓扑排序?

graph combinatorics topological-sort

5
推荐指数
1
解决办法
923
查看次数

与python中的重复组合,其中顺序很重要

来自 python 的文档:https : //docs.python.org/2/library/itertools.html#itertools.combinations

见组合_with_replacement:“#组合_与替换('ABC',2)--> AA AB AC BB BC CC”

我想使用相同的功能,附带生成“BA”、“CA”和“CB”的奖励。

python combinations combinatorics cartesian-product python-itertools

5
推荐指数
1
解决办法
3416
查看次数

您如何确定如何将硬币放在时钟上?

假设您有一组硬币,例如 4 10¢、4 5¢ 和 4 1¢。

您被要求将这些硬币放置在 12 小时模拟钟面上,您放置的下一个硬币必须在前一个硬币之后 X 小时放置,其中 X 是前一个硬币的价值。

因此,如果您将 1 美分放在 12 上,则您放置的下一个硬币将变为 1。如果您将 5 美分放在 1 上,则您放置的下一个硬币将变为 6。以此类推。

在下一个硬币必须放入已经被占用的插槽之前,您如何最大限度地增加可以放置在时钟上的硬币数量?

这是我遇到的一个问题,除了通过详尽的搜索之外,我一直无法解决。如果输入是任意的,详尽的搜索很快就会失败——比如说它是任意数量的任意已知面额的硬币,时钟上有任意数量的小时。然后你就不能再进行穷举搜索了,因为它变成了阶乘时间并且由于过多的计算时间要求而失败。

algorithm combinatorics

5
推荐指数
1
解决办法
2170
查看次数

以子列表的形式获取列表的所有可能组合

我想知道是否有人可以帮助完成以下任务:当顺序无关紧要时,如何将列表的所有组合拆分为子列表?

假设我有一个包含 4 个项目的列表:

import itertools as it

a = [1, 2, 3, 4]
print(list(it.combinations(a, 2)))
Run Code Online (Sandbox Code Playgroud)

这会给我一个包含 6 个可能对的列表:

[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
Run Code Online (Sandbox Code Playgroud)

如何制作(用它?或任何其他方式)一组[1, 2, 3, 4]以任何顺序包含原始序列的列表?因此,对于此示例,它将包含三个子列表:

 [(1, 2), (3, 4)]
 [(1, 3), (2, 4)]
 [(1, 4), (2, 3)]
Run Code Online (Sandbox Code Playgroud)

更新:一个小的澄清:换句话说,当 n 元组中的顺序无关紧要时,我需要获取所有 n 元组集,以便它们的成员包含原始列表的所有人口。因此[(1, 2), (3, 4)]可以,但[(2, 1), (3, 4)]如果我们忽略顺序,则不需要,因为它与第一组相同。

UPDATE2:因此对于长度为 6 的列表和大小为 2 的块,此fun函数应按如下方式工作:

import itertools as it
a = [1, 2, 3, …
Run Code Online (Sandbox Code Playgroud)

python combinations combinatorics python-itertools

5
推荐指数
1
解决办法
869
查看次数

缺少 Haskell 原语以将函数连续应用于列表的每个元素?

在 Haskell 中,众所周知,map原语可用于将给定函数应用于列表的所有元素:

 ?> map toUpper "abcd"
"ABCD"
 ?> 
Run Code Online (Sandbox Code Playgroud)

在尝试生成有限集(列表)的所有分区时,以下类似的原语会很方便:

 ?> sap toUpper "abcd"
["Abcd","aBcd","abCd","abcD"]
 ?> 
Run Code Online (Sandbox Code Playgroud)

sap站立连续应用。类型签名将是:

sap :: (a -> a) -> [a] -> [[a]]
Run Code Online (Sandbox Code Playgroud)

例如,集合“abcd”的部分分区可以从“bcd”的分区中通过用('a':)sap'来获得。

 ?> pbcd = [["b","c","d"],["b","cd"],["bc","d"],["c","bd"],["bcd"]]
 ?> 
 ?> concatMap (sap ('a':)) pbcd
[["ab","c","d"],["b","ac","d"],["b","c","ad"],["ab","cd"],["b","acd"],["abc","d"],["bc","ad"],["ac","bd"],["c","abd"],["abcd"]]
 ?> 
Run Code Online (Sandbox Code Playgroud)

然后可以通过添加 'a' 作为它自己单独的单例来获得 5 个丢失的分区。

我的问题是,我一直无法在语言库中找到这样的原语,而且给定类型签名的Hoogle没有返回任何感兴趣的内容。

sapHaskell 语言库中是否存在这样的原语???或者有没有一种方法可以写得如此简短和简单,以至于它甚至不值得成为一个单独的函数,将其置于所谓的费尔贝恩阈值以下

脚注:可以这样写sap

sap :: (a -> a) -> [a] -> [[a]]
sap fn ls = fst  $  foldr …
Run Code Online (Sandbox Code Playgroud)

haskell combinatorics

5
推荐指数
2
解决办法
183
查看次数

SQL:使用所有可能的组合进行更新

我有关系

+-----+----+
| seq | id |
+-----+----+
|   1 | A1 |
|   2 | B1 |
|   3 | C1 |
|   4 | D1 |
+-----+----+
Run Code Online (Sandbox Code Playgroud)

并希望将其加入 PostgreSQL

+----+-------+
| id | alter |
+----+-------+
| B1 | B2    |
| D1 | D2    |
+----+-------+
Run Code Online (Sandbox Code Playgroud)

所以我得到了所有可能的替换组合(即或多或少替换的笛卡尔积)。所以第1组没有更新,第2组只有B2,第3组只有D2,第4组有B2和D2。

结尾应该像这样,但应该对更多人开放(例如 D1 的额外 D3)

+-------+-----+----+
| group | seq | id |
+-------+-----+----+
|     1 |   1 | A1 |
|     1 |   2 | B1 |
|     1 | …
Run Code Online (Sandbox Code Playgroud)

sql postgresql routes combinatorics variations

5
推荐指数
1
解决办法
245
查看次数

在 python 中寻找一些关于组合学的指导

仍然是 Python 和编码的新手,这次冒险只有大约 6 周。我开始了一个金融项目,试图弄清楚投资组合的现金比例应该是多少,以及应该根据当前的市场表现投资多少。不知道这项研究是否有任何相关性,但它有助于坚持每一步并学习新事物。

对于任何感兴趣的人,这是谷歌合作木星笔记本 https://github.com/Jakub-MFP/My_FIRE_Project/blob/master/portfolio_management/cashposition_backtest.ipynb

在第 4 步中,我正在尝试运行某种组合模拟。我一直在阅读https://docs.python.org/3/library/itertools.html,但它对我需要开始的地方有点不知所措。只是寻找一些关于我应该研究的术语或内容的指导,以解决这个特定问题。

此外,查看并看到称为 tpot 的东西对组合数学有好处?

组合问题

目前,在第 3 步中,我为市场上的各种下跌做了一个预定义的循环。它看起来像这样

   if (current_market_status == 0):  # all time high record
        current_cash_required_equity = 0.3
    elif (current_market_status < -0.05): #less than 5%
        current_cash_required_equity = 0.25
    elif (current_market_status < -0.10): #less than 10%
        current_cash_required_equity = 0.20 
    elif (current_market_status < -0.15): #less than 15%
        current_cash_required_equity = 0.15
    elif (current_market_status < -0.20): #less than 20%
        current_cash_required_equity = 0.10
    elif (current_market_status < -0.25): #less than 25%
        current_cash_required_equity = …
Run Code Online (Sandbox Code Playgroud)

python numpy combinatorics

5
推荐指数
1
解决办法
129
查看次数