PHP中MySQL的子集求和问题

PHP中MySQL的子集求和问题,php,mysql,subset-sum,knapsack-problem,Php,Mysql,Subset Sum,Knapsack Problem,以下问题: 我有一个MySQL数据库,里面有歌曲。数据库具有以下结构: id INT(11)(PRIMARY) title VARCHAR(255) album VARCHAR(255) track INT(11) duration INT(11) 用户应该能够在php表单中输入一个特定的时间,php函数应该给他一个列表,列出所有可能的歌曲组合,这些歌曲的组合加起来等于给定的时间±X分钟 因此,如果用户想要听1小时±5分钟的音乐,他将在表单中输入60分钟和5分钟的阈值,并将接收所有可能的歌曲集

以下问题:

我有一个MySQL数据库,里面有歌曲。数据库具有以下结构:

id INT(11)(PRIMARY)
title VARCHAR(255)
album VARCHAR(255)
track INT(11)
duration INT(11)
用户应该能够在php表单中输入一个特定的时间,php函数应该给他一个列表,列出所有可能的歌曲组合,这些歌曲的组合加起来等于给定的时间±X分钟

因此,如果用户想要听1小时±5分钟的音乐,他将在表单中输入60分钟和5分钟的阈值,并将接收所有可能的歌曲集,总计55到65分钟。它不应该打印出重复的内容

我已经找到了解决这个问题的几种方法,但是他们只给我返回了加起来是X的持续时间,而不是歌曲名称等。所以我的问题是如何解决这个问题,以便它给我返回歌曲的ID,这些歌曲的ID加起来是所需的时间,或者用相应的歌曲名称打印出列表


这似乎是我找到的最佳答案之一,但我无法将其应用于我的数据库。

您所描述的是一个问题。我上大学的时候,我们经常遇到这样的问题

这些方法(只需尝试每一种组合,直到一种(或多种)有效)是一个复杂性
O(n!)
,或阶乘长度问题-迭代和计算非常漫长

如果您的曲目时间存储为
int
(秒对我来说似乎是最简单的数学),那么您的背包大小为3300-3900(3600秒==1小时)

您的目标是始终返回匹配的第一个集合,还是始终返回随机集合


注意-通过限制你的口袋大小,你可以大大增加可能的答案的数量。

你所描述的是一个问题。当我在大学时,我们经常解决这样的问题

这些方法(只需尝试每一种组合,直到一种(或多种)有效)是一个复杂性
O(n!)
,或阶乘长度问题-迭代和计算非常漫长

如果您的曲目时间存储为
int
(秒对我来说似乎是最简单的数学),那么您的背包大小为3300-3900(3600秒==1小时)

您的目标是始终返回匹配的第一个集合,还是始终返回随机集合


注意-通过限制你的口袋大小,你可以大大增加可能的答案数量。

持续时间不应该是时间,而应该是一个无符号整数,可能存储每首歌曲的秒长。你是对的!我已将时间更改为INT,并以秒为单位添加了持续时间。持续时间不应该是时间,而应该是一个无符号整数,可能存储秒长s每首歌曲的长度。你说得对!我已将时间改为INT,并以秒为单位添加了持续时间。我的目标是返回所有可能匹配的歌曲组合,不包括重复的歌曲。@DcBexter-然后意识到,一旦超过了少量曲目(例如,50首),计算时间将变得令人望而却步。我意识到了这个问题,这也是我喜欢NikiC在上面问题链接的帖子中的方法的原因之一。但现在复杂性不是问题。我的目标是返回匹配的所有可能的歌曲组合,不包括重复的。@DcBexter-然后意识到这一点一旦你超过了一个微不足道的轨道数(比如说,50),计算时间就会变得令人望而却步。我意识到这个问题,这就是为什么我喜欢NikiC在我上面问题链接的帖子中的方法的原因之一。但目前复杂性不是一个问题。