こんばんは。初めて投稿するので質問の仕方が悪くてすみません。
2 時間近くブレインストーミングを行ったが、適切な解決策が見つからないため、特定の演習に関する支援を探しています。演習は次のとおりです。特定の数のワゴンが与えられた場合、2 人の泥棒が最高の利益を求めて競争します。
最初の泥棒、たとえば A が最初に摘み取りを開始します。泥棒は、リストで現在利用可能な最初または最後のワゴンのいずれかを選択する可能性があります。次に、選択したワゴンがリストから削除され、その値がそれぞれの泥棒のカウンターに追加されます。この演習の目的は、泥棒 A が可能な限り最高の利益を得ると同時に、泥棒 B が同じことをしようとしていることを確認することです。
たとえば、次の入力があるとします。
6
10
150
3
7
9
9
これは、値が 10、150、3、7、9、および 9 のワゴンが 6 台あることを意味します。最適な戦略に従う場合、両方の泥棒が最適な戦略に従うと仮定すると、出力は 166 になります。ただし、これまでのところ、盗賊 B がどのようにプレイしても、盗賊 A が獲得できる最高の結果である 169 しか得られませんでした。
両方の泥棒がコードに関して最適な戦略に従うことを保証する方法がわかりません。考えられるすべての組み合わせをチェックする必要があると思われますが、結果を見て、どちらの泥棒が最適な戦略に従っているかを判断するにはどうすればよいでしょうか? 何か案は?
コード:
#include <stdio.h>
#include <stdlib.h>
#define DEBUG 0
int max = 0;
int diff = 9999;
int heist(int *wagons, int i, int j, int carry, int turn, int pos){
#if DEBUG
printf("DEBUG! i: %d || j: %d || carry: %d || turn: %d || post: %d || max: %d\n",i,j,carry,turn,pos,max);
#endif
/* Stopping condition */
if (i==j){
if (turn) carry += wagons[i];
if (carry>=max){
max = carry;
}
return 0;
}
if (!pos){
/* First wagon */
if (turn) carry += wagons[i];
i++;
} else {
/* Last wagon */
if (turn) carry += wagons[j];
j--;
}
turn = !turn;
heist(wagons,i,j,carry,turn,0);
heist(wagons,i,j,carry,turn,1);
return 0;
}
int main()
{
/* Variables */
int n;
scanf("%d",&n);
if (!n){
printf("0\n");
return 0;
}
int wagons[n];
int i;
/* Inputs */
for (i=0;i<n;i++){
scanf("%d",&wagons[i]);
}
heist(wagons,0,n-1,0,1,0);
heist(wagons,0,n-1,0,1,1);
printf("%d\n",max);
return 0;
}