PHP与MySQL的子集和问题

时间:2011-09-14 12:34:32

标签: 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分钟的阈值,并且将接收所有可能的歌曲集合,总计55到65分钟。它不应该打印重复。

我已经找到了解决这个问题的几种方法,但是它们只给了我加上X的持续时间,而不是歌曲名称等等。所以我的问题是如何解决这个问题,这样它就能给我回复ID了添加到所需时间的歌曲或打印出具有相应歌曲名称的列表。

This似乎是我找到的最佳答案之一,但我无法将其改编为我的数据库。

1 个答案:

答案 0 :(得分:0)

您所描述的是Knapsack Problem。当我在大学时,我们使用Dynamic Programming来解决这样的问题。

brute-force方法(只需尝试每个组合,直到一个(或多个)工作是复杂性O(n!),或因子长度问题 - 非常冗长,以便迭代和计算!

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

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

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