2011-12-22 1 views
1

入力:総費用。異なる高さのスタックのコレクションがある場合、どのようにすべての組み合わせを選択できますか?

出力:希望のコストを与えるすべてのレベルの組み合わせ。

各スタックの各レベルのコストは異なります(スタック1のレベル1はスタック2のレベル1と同じです)。私は手動で(ハードコードされた)入力した基本コスト(レベル1)に基づいてレベルを実際のコストに変換する機能を持っています。

私は入力されたコストを与えるレベルの組み合わせを見つける必要があります。私は可能な解決策が複数あることを認識していますが、あらゆる可能性を繰り返す方法が必要です。

ここ

は私が必要なものである:

入力= 224、これは解決策のです: these are the costs


私は別のレベルを選択する必要が簡単なプログラムを作ってるんですスタックを計算してからコストを計算すると、存在するすべての可能なコストを知る必要があります...各スタックの各レベルの金額はそれぞれ異なりますが、問題はありません。問題はスタックごとに1つのレベルを選択する方法です。

私はおそらく非常に漠然とので、ここで絵(あなたは私の貧弱な描画能力を言い訳にする必要があります)だと説明:だから

these are the maximum levels

、すべてのスタックはレベル0、そして常にレベル0を持っています0のお金を要する。

追加情報:

  • I「がmaxLevels」と呼ばれる配列を有していて、その配列の長さは、スタックの数であり、各要素は、例えば、そのスタックの最上位(の数であります、maxLevels [0] == 2)。
  • レベル0はまったく重要ではないため、第1レベルから反復することができます。
  • 選択したレベルはmaxLevels(同じ長さ)と似ていますが、最大レベルのスタックを格納する代わりに、スタックの選択レベルを格納する配列(名前: "currentLevels")に保存する必要があります:currentLevels [3] == 2)
  • 私はC++でのプログラミングだけど、擬似コードは同様に細かいです
  • この宿題、私は(それがために、基本的です楽しみのためにそれをやっているではないです。ゲーム)
+0

。おそらく、具体的な例を提示して、入力、出力、および出力を計算するためのステップを表示できますか? – NPE

+0

私はあなたがそれから何かを得るとは思わない...入力だけがコストであり、各スタックの各レベルは少し増加するので、プログラムのタスクは異なるレベルの正確なコンボを見つけることで一致するコスト。私はすぐに戻ってくるだろうし、私は質問を編集します! – corazza

+0

'(currentLevels [0] + currentLevels [1] + currentLevels [2] + ...)== requested_cost'これは達成したいことですか?または、レベル5の費用は5と異なることができますか? – Baltram

答えて

3

私は質問を理解しているかどうかはわかりませんが、ここではどのように各stから1つのアイテムを選択するかACK(この場合は3 * 1 * 2 * 3 * 1 = 18の可能性):

void visit_each_combination(size_t *maxLevels, size_t num_of_stacks, Visitor &visitor, std::vector<size_t> &choices_so_far) { 
    if (num_of_stacks == 0) { 
     visitor.visit(choices_so_far); 
    } else { 
     for (size_t pos = 0; pos <= maxLevels[0]; ++pos) { 
      choices_so_far.push_back(pos); 
      visit_each_combination(maxLevels+1, num_of_stacks-1, visitor, choices_so_far); 
      choices_so_far.pop_back(); 
     } 
    } 
} 

あなたはコードをより具体的にするために、それぞれの組み合わせでやりたいものは何でもしてvisitor.visitを置き換えることができます。私はあなたの配列currentLevelsの代わりにchoices_so_farベクトルを使用しましたが、それは同様に配列で動作することができます。

+0

ねえ、私はC++には新しく、擬似コードで再コード化できますか? size_tとはどういう意味ですか?星と "&"記号は何ですか?ポインタと何か、私は推測する?私はそれがより簡単にできると思う...とにかく "ビジター"とは何ですか?オブジェクト?私は完全に "std :: vector &choices_so_far"で自分自身を失いました...また、 "maxLevels + 1"は、配列ではありませんか?配列に1をどのように追加できますか? – corazza

+0

ねえ、私はそれを理解したと思う。本質的に私のソリューションはあなたのものと似ています。なぜなら私も再帰を使用していたからです。ありがとうございました。 – corazza

2

正しく理解すれば、これは非常に簡単です。最小コストは0で、最大コストはスタックの高さの合計にすぎません。これらの制限の間の特定のコストを達成するには、左側から始めて、目標に達するまで各スタックの最大レベルを選択し、残りのスタックのレベル0を選択します。 (ターゲットをオーバーシュートする場合、最後の非ゼロスタックを調整する必要があるかもしれません。)

+0

いいえ、それはそうではありません。正確なコストは、異なるスタックの異なるレベルの組み合わせです。新しい絵を見てください。 :) – corazza

+0

その場合、スタックの高さが2であればナップザック問題になるので、問題はNP完全です。実際には、スタックの数がスタックの数よりも大きくなると、約30または40 - http://en.wikipedia.org/wiki/NP-completeを参照してください。 – TonyK

+0

私はそれに何か問題はありません。私が言ったように、それはゲームのためのものです、そして、それは、いくつかのプレーヤーが持っている研究を計算することです。ゲームには16の研究があり、そのために私は16のスタックを使用しています。各研究にはレベルがあり、各レベルは前回の2倍のコストがかかり、最初のものはその研究の基本コストです。私はそれを考え出しました、それはうまく機能していませんが(この部分ではなく、私はすべての可能性を選択します)。私がそれを理解した後、私はすぐに世界のポイントで#1のプレーヤーでそれをテストし、わずか数秒で結果を出しました。 – corazza

2

私はそれを解決したと思います。 @ Steve Jessopは私に再帰を使う考えを与えました。

アルゴリズム:私は質問数回再読んで、それを理解するのに苦労しています

circ(currentStack) 
{ 
    for (i = 0; i <= allStacks[currentStack]; i ++)   
     if (currentStack == lastStack && i == allStacks[currentStack]) 
      return 0; 
     else if (currentStack != lastStack) 
      circ(++ currentStack); 
} 
関連する問題