タイトル説明
ベッシーや友人についてはほとんど知られた事実は、彼らが階段登りレースを愛していることです。よく知られている事実は、牛が実際に階段を下りて行く好きではないということです。だから、牛は自分の好きな超高層ビルの頂上にレースが終わった後、彼らは問題を抱えていました。階段を使って下りバック登ることを拒否し、牛がバックグラウンドフロアに到達するためにエレベーターを使用するように強制されています。
エレベータiがC_I(1 <= C_I <= W)ポンドの重さWの最大重量容量(1 <= W <= 100,000,000)ポンド牛を有しています。ベッシーはエレベーターに乗るの最小数を使用して地上階に牛のすべてのN(1 <= N <= 18)を取得する方法を見つけ出す助けてください。各エレベータに乗って牛の重みの合計はWよりも大きくてはなりません
今のグループに入れられるn個のアイテム、[i]はWボリュームを与え、各グループは、<= W、Q最小パケットの総容積を必要とします。(N <= 18)
入力形式
* 1行目:NとWのスペースで区切られています。
* 2..1 + Nライン:ラインI + 1は、乳牛の1の重さを与え、整数C_Iが含まれています。
出力フォーマット
必要に応じて、エレベータ乗りの最小数を示す*単一の整数、R、。
Rの一つは、エレベーターを下にトリップします。
サンプル入力と出力
4 10 5 6 3 7
3
説明/ヒント
5、6、3、および7ポンドの重量を量る4頭の牛があります。エレベーターは10ポンドの最大重量容量を有します。
私たちは、他の牛と同じエレベーターに計量牛3を置くことができますが、他の3頭の牛を組み合わせることにはあまりにも重いです。上記溶液のために、エレベータ乗り1は、牛の#1、#3、エレベータ乗り2牛#2、及びエレベータ乗り3を含む牛#4を含むことを含みます。他のいくつかのソリューションは、この入力可能です。
溶液:圧縮された状態DP、G [I]は[i]は少なくとも使用される「バッグ」の状態を示しfはiがよ、番号iは状態空間ダウンによって表されます。
書式#include <iostreamの> の#include <アルゴリズム> 書式#include <キュー> の#include <cmath> の#include <CStringの> の#include <cstdlib> 書式#include <cstdioを> 使用して 名前空間はstd; CONSTの INT N = 20 。 CONSTの 整数 M = 1 << 18 + 5 。 const int型 OO = 0x3f3f3f3f 。 INTのN、M、[N]、F [M]、G [M]。 INT メイン(){ scanf関数(" %d個の%のD "、&N、&M)。 INT OP =(1個の << N)。 以下のために(int型私= 1 ; iが<= N; iが++ ) のscanf(" %dの"、および[I])。 memsetの(F、0x3fを、はsizeof (F))。 F [ 0 ] = 1 ; G [ 0 ] = M。 用(int型 iは= 0 ; I <OP iが++ ){ ため(INT J = 1 ; J <= nであり、j ++ ){ 場合((1 <<(J- 1))&I)続行 ; // オブジェクトから選択された IF(G [I]> A = [J] && F [I |(1 <<(J- 1))]> = F [I]){ // オブジェクトが中に配置することができる F | [I(1 <<(J- 1。 =))] F [I]は、 G [I |(1 <<(J- 1))] = MAX(G [I |(1 <<(J- 1)]、G [I] - )[J]); } そう IF(G [I] <[J] && F [I |(1 <<(J- 1)) ]>Fは= [I] + 1。){ // パッケージが収まらない Fを[I |(1。 <<(J-1))] i]が+のF [= 1 。 G [I |(1 <<(J- 1))] = MAX(G [I |(1 <<(J- 1))]、M [J])。 } } } のprintf(" %dの" F、[(1個の << N) - 1 ])。 リターン 0 ; }