AOJ 0169 Blackjack

問題

(http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0169)

解法

DFSが楽。あとは1以外を全部足してから1をどうするかってやる。

コード

DFS

int a[512], p;

int dfs(int n, int c){
  if(n > 21) return 0;
  if(c == p) return n;
  if(a[c] == 1) return max(dfs(n+1, c+1), dfs(n+11, c+1));
  if(a[c] > 10) return dfs(n+10, c+1);
  return dfs(n+a[c], c+1);
}

int main(){
  char str[512];
  while(fgets(str, sizeof(str), stdin) && str[0] != '0'){
    memset(a, 0, sizeof(a));
    char *tp;
    p = 0;
    tp = strtok(str, " ");
    while(tp != NULL){
      a[p++] = atoi(tp);
      tp = strtok(NULL, " ");
    }

    printf("%d\n", dfs(0, 0));
  }
  return 0;
}
int a[14], p;

int main(){
  char str[514];
  while(fgets(str, sizeof(str), stdin) && str[0] != '0'){
    memset(a, 0, sizeof(a));
    char *tp;
    tp = strtok(str, " ");
    while(tp != NULL){
      a[atoi(tp)]++;
      tp = strtok(NULL, " ");
    }

    int res = 0;
    a[10] += a[11]; a[10] += a[12]; a[10] += a[13];
    REP(i, 2, 11) res += a[i]*i;

    int one = 11*a[1];
    while(res+one > 21 && one != a[1]){
      one -= 10;
    }
    res += one;
    if(res > 21) res = 0;

    printf("%d\n", res);
  }
  return 0;
}