2011-01-19 13 views

答えて

2

解決策を見ることなく、これは標準DPのように見えます。各状態は、アイテムのリストで表される

は、(= 51可能なオプションを50格納+ 1原位置)(2^15組み合わせ)を購入し、車の現在位置に残しました。

ある状態から他の状態への遷移は簡単です。

def minCost(itemsLeft, currentPosition) 
    current_minimum = INFINITY 

    for (each store in the list) { 
     if (store.containsSomeOf(itemsLeft)) { 
      candidate = minCost(itemsLeft - store.items, store) 
        + cost_of_items_bought_at_store + cost_of_driving 
      current_minimum = min(current_minimum, candidate) 
     } 
    } 

    return current_minimum 
end 

当然、itemListはビットマスクではなく、実際のリストとして表されます。

傷みやすいアイテムも考慮する必要がありますが、それはまったく技術的なものです。

最後に、再帰にmemoizationを適用するか、純粋なDPとして書き直す必要があります。

+0

これはまさに私がやったことですが、それは小さな問題のセットではうまくいきますが、大きなものではまったく動作しません。もちろん、低レベルは最適化されていません。私は、インテグレーションを処理するためにカスタムデータ構造を使用することができるセットをたくさん使用しています。私はトップソリューションがC/++で書かれていることを知っていますが、どの程度の非効率性が言語に由来しているのか、そして低レベル実装の詳細からどれくらいのものがあるのでしょうか。 – ripper234

+0

@ ripper234 'Set 'を使っているのなら、それは言語の誤りではありません:) 'new int [1 << 15] [51]'のような配列を使って結果を記憶できます。 –

関連する問題