を支払うために最適な法案の組み合わせを探す:、10,5,4,3:私は次の要件を支払システムでゲームに取り組んでいます特定の値
1-ゲーム内マネー法案であると仮定2,1
2 AIは正確な金額をカバーするのに必要な最低限の請求書を選択する必要があります。つまり、支払いが必要な場合は8、AIの場合は(4,4,3,3,2)... (3、4、2)
3 AIは、自分が持っている紙幣を使って正確な金額を作ることができない場合は、最小の差の値で、すなわち必要な支払う金額は7でAIには以下の請求書(10,5,4,4)があり、彼は(4,4)を選んで、プレーヤー1に必要以上の金額を与えます。
以下は私のコード
//sortedValues is a list containing my bills in descending order
//ChosenCardsToPay is a list for the bills I choose to pay with
public void PreparePayment(int neededAmount)
{
int remainingAmount = neededAmount;
int chosenAmount;
while (remainingAmount > 0)
{
chosenAmount = 0;
foreach (int moneyValue in sortedValues)
{
if (moneyValue <= remainingAmount)
{ chosenCardsToPay.Add (moneyValue); //Add Bill Value to my candidate list
remainingAmount = remainingAmount - moneyValue;
chosenAmount = moneyValue;
break;
}
}
if (chosenAmount != 0)
sortedValues.Remove (moneyValue);//Remove Chosen Bill from Initial List
else //If all bill values are greater than remaining amount, i choose the bill with smallest value and add to the candidate list
{
chosenAmount = sortedValues.Last();
sortedValues.Remove(chosenAmount);
chosenCardsToPay.Add (chosenAmount);
remainingAmount = remainingAmount - moneyValue;
}
}
}
それは時代のほとんどを正常に動作しますが、このケースを取る:法案として必要な量は4で、AIが(3,2,2)を持っています。上記のアルゴリズムを用いて、AIは最適解が(2,2)であるところで(3,2)を選択する。
誰かがこの問題について私に正しい考え方を教えてもらえますか?ありがとう!
する必要があります*最小差分値* * *常にポジティブであるか、またはそれは、正または負のいずれかになることができますか?例えば。 '[5、4、3]'が '10 'のときに支払われます。正解は「12」(「5 + 4 + 3」)または「9」(「5 + 4」)ですか? –
この問題は、サブセットサム問題の何らかの形であるため、np-completeです。つまり、一般的に指数関数的な時間が必要になります。あなたのコードは再帰や指数関数的な部分を持たないので、一般的に問題を解決することはできません。あなたのコードは、貪欲アプローチに基づくヒューリスティック/近似です。 – sascha
ここでは適切でない欲張りアルゴリズムを使用しています。同様の問題(サブセット合計、コイン変更)のためのダイナミックプログラミングアプローチを検討してください。 – MBo