晚上好。如果这个问题编写得很糟糕,我很抱歉,因为这是我第一次在这里发帖。
我正在寻找特定运动的帮助,因为我现在已经头脑风暴了近两个小时,无法找到合适的解决方案。 练习如下:给定一定数量的货车,两个小偷将争夺最高利润。
第一个小偷,让我们说A,首先开始挑选。小偷可以挑选列表中当前可用的第一辆或最后一辆货车。然后将挑选的货车从列表中移除,并将其值添加到相应小偷的计数器中。这个练习的目的是为小偷A获得尽可能高的利润,同时也确保小偷B试图做同样的事情。
例如,如果我们有以下输入:
6
10个
150个
3
7
9
9个
这意味着有6辆货车,价值分别为10,150,3,7,9和9。如果遵循最优策略,输出应为166,假设两个小偷都遵循最优策略。然而,到目前为止,我所获得的只有169,这在理论上是小偷A无论小偷如何扮演的最高结果。
我没有看到如何确保两个小偷都遵循最佳策略代码。它应该是一个练习,你必须检查所有可能的组合,但我怎样才能看到结果并弄清楚哪个小偷都遵循了最佳策略?有什么想法吗?
代码:
#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;
}
答案 0 :(得分:1)
你的算法会探索所有可能性并计算小偷A的最大结果。如果小偷B使用最差的策略,你会得到最好的分数。
你必须找到小偷A的最佳分数所有小偷B的可能策略
对于小偷A的每次移动,计算小偷B的最佳策略并选择A移动以最小化该移动。迭代。
答案 1 :(得分:0)
你需要一个评估函数,它可以从给定的起始位置返回两个玩家的得分,假设两者都达到最佳状态。
#include <stdio.h>
#define N 6
const int WAGONS[N] = { 10, 150, 3, 7, 9, 9 };
// note: SCORE is used as output only
void heist (int score[2], const int *wagons, int i, int j, int player)
{
if (i > j) {
score[0] = 0;
score[1] = 0;
}
else {
int score_first[2];
int score_last[2];
// calculate outcome when taking the first element
heist (score_first, wagons, i + 1, j, 1 - player);
score_first[player] += wagons[i];
// calculate outcome when taking the last element
heist (score_last, wagons, i, j - 1, 1 - player);
score_last[player] += wagons[j];
// select optimal choice
if (score_first[player] > score_last[player]) {
score[0] = score_first[0];
score[1] = score_first[1];
}
else {
score[0] = score_last[0];
score[1] = score_last[1];
}
}
}
int main ()
{
int score[2];
heist (score, WAGONS, 0, N - 1, 0);
printf("%d, %d\n", score[0], score[1]);
return 0;
}