私はこの問題をオンラインでのコーディングの課題に抱いています。最小のスタック数で効率的に箱を積み重ねますか?
長さと幅(l、h)のボックスのリストが与えられている場合、長さと幅が次の値より小さい場合は、他の箱。
私は多項式時間解法を思いつく方法を理解できません。私はすべての可能なスタック配置を再帰的に作成するブルートフォース・ソリューションを構築しました(Nスタックで始まり、各スタックについてはスタックの上に置いてから、新しいスタック配置ではすべてのスタックの可能性を再帰的に生成します)必要なスタックの最小数を返します。
私はいくつかの最適化とそれをスピードアップしました:あなたはボックスBとボックスCの上にボックスAをスタックすることができ、あなたはボックスCの上にボックスBを積み重ねることができた場合は、次にやる、
- :ここでは、このソリューションのためのPythonコードだ、箱Cに
- Memoizeスタックの手配をボックスAを積み重ねるだけスタック
の底部と頂部のレベルを考慮し検討していません210
入力
17
9 15
64 20
26 46
30 51
74 76
53 20
66 92
90 71
31 93
75 59
24 39
99 40
13 56
95 50
3 82
43 68
2 50
出力:
33.7288980484
6
アルゴリズムは、数秒(1-3)で16箱の問題、〜30秒で17箱の問題を解決します。私はこれが指数関数的な時間だと確信しています。 (スタック配列の指数関数的な数があるので)。
私は確かに多項式時間解があると確信していますが、それは何か分かりません。問題の1つは、メモの作成は現在のスタック配置に依存するということです。これは、より多くの計算を行う必要があることを意味します。
グラフの問題にする –
補足として:あなたのコードが意図したとおりに動作し、より良いものにしたいのであれば、ここに投稿してみてください:codereview.stackexchange.com – MooingRawr
箱を回転させることはできますか? – kraskevich