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