2011-09-14 9 views
2

次の問題:MySQLでPHPのサブセットサム問題

私はそこに曲を持つMySQLデータベースを持っています。

id INT(11)(PRIMARY) 
title VARCHAR(255) 
album VARCHAR(255) 
track INT(11) 
duration INT(11) 

は、ユーザーがPHPのフォームに特定の時刻を入力することができるはずとPHPの機能が彼に与えられた時間まで追加曲のすべての可能な組み合わせのリストを与える必要があります。データベースには、以下の構造を有します< X min。

したがって、ユーザーが1時間の音楽&5分を聴きたい場合は、フォームに60分と5分のしきい値を入力し、可能なすべてのソングセットを受信して​​合計55〜65になります分。それは重複して印刷するべきではありません。

私はすでにこの問題のいくつかのアプローチを見つけましたが、曲名などではなくXまでの期間を返すだけでした。だから私の問題はこれを解決する方法です。所望の時間までに合った曲、または対応する曲名でリストをプリントアウトする。

This私が見つけた最高の回答のようですが、私は自分のデータベースに適用できません。

+4

持続時間はTIMEではなく、各曲の秒の長さを格納する非符号付き整数である必要があります。 –

+0

あなたは正しいです! TIMEをINTに変更し、秒数で期間を追加しました。 – DcBexter

答えて

0

説明しているものはKnapsack Problemです。私が大学にいた時、私たちはDynamic Programmingを使ってこのような問題を攻撃しました。

brute-force方法(ただ1つ(またはそれ以上まで、すべての組み合わせを試してみてください)作品の複雑O(n!)、または階乗の長さの問題である! - 極めてを反復処理し、計算することが長い

トラックのあなたの時間がある場合(秒で私に一番簡単な数学を思わ)intとして格納され、その後、あなたのナップザックサイズは3300から3900(3600秒== 1時間)である。

は、常に一致する最初セットを返すためにあなたの目標です常にraを返すndomセット?

注 - 袋サイズの境界を設定すると、可能な回答の数が大幅に増えます。

+0

私の目標は、重複していない曲の組み合わせをすべて返すことです。 – DcBexter

+0

@DcBexter - その後、一度あなたが些細な数のトラック(例えば、50)を超えると、計算時間が非常に長くなることに気づくでしょう。 – warren

+0

私はこの問題を認識しています。それは、上記の私の質問にリンクされた投稿のNikiCのアプローチが好きな理由の1つです。しかし、現時点では、複雑さは問題ではありません。 – DcBexter