以下问题:
我有一个包含歌曲的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似乎是我找到的最佳答案之一,但我无法将其改编为我的数据库。
答案 0 :(得分:0)
您所描述的是Knapsack Problem。当我在大学时,我们使用Dynamic Programming来解决这样的问题。
brute-force方法(只需尝试每个组合,直到一个(或多个)工作是复杂性O(n!)
,或因子长度问题 - 非常冗长,以便迭代和计算!
如果您的曲目时间存储为int
(在几秒钟内对我来说似乎是最简单的数学运算),那么您的背包大小为3300-3900(3600秒== 1小时)。
您的目标是始终返回匹配的第一个集,还是始终返回随机集?
注意 - 通过限制你的口袋大小,你可以大大扩展可能的答案数量。