簡體   English   中英

貨車搶劫(C語言)

[英]Wagon Robbery (C Language)

晚上好。 如果問題的格式不正確,我感到很抱歉,因為這是我第一次在此處發布。

我正在尋求特定運動的幫助,因為我已經進行了近兩個小時的頭腦風暴,找不到合適的解決方案。 練習如下:給定一定數量的貨車,兩個小偷將爭奪最高利潤。

第一個小偷,比如說A,首先開始采摘。 小偷可以選擇列表上當前可用的第一個或最后一個旅行車。 然后從列表中刪除選擇的貨車,並將其值添加到該小偷的計數器中。 練習的目的是為小偷A獲得最大可能的利潤,同時還要確保小偷B試圖這樣做。

例如,如果有以下輸入:

6
10
150
3
7
9
9

這意味着有6個旅行車,其值分別為10、150、3、7、9和9。 如果遵循最佳策略,則假設兩個盜賊都遵循最佳策略,則輸出應為166。 但是,到目前為止,我已經設法獲得的全部是169,從理論上講,無論賊B的游戲方式如何,賊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;
}

您的算法將探索所有可能性,並為小偷A計算最大結果。毫不奇怪,如果小偷B使用最壞的策略,您將獲得最大的分數。

您必須為小偷B的所有可能策略找到最佳的小偷A分數

對於小偷A的每個舉動,計算小偷B的最佳策略,然后按A選擇舉動,以將其最小化。 重復。

您需要一個評估函數,該函數可以從給定的起始位置返回兩個球員的得分,並假設兩個球員都處於最佳狀態。

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM