Here is my solution. It's just another simulation.
Ruby 1.9 only.

Usage: ruby1.9 [upcard] [number of decks] [number of games]

Pastie: http://pastie.caboo.se/135733

Code:

class Array
  def score
    sort.inject(0){|s,c| s+c > 21 && c==11 ? s+1 : s+c }
  end
end

unless ARGV[0]
 (2..11).each{|n| puts `ruby1.9 #{__FILE__} #{n}`}
 exit
end

puts "upcard: #{upcard = ARGV[0].to_i}"
NDECKS = (ARGV[1]||2).to_i
CARDS = (((2..11).to_a+[10]*3)*4*NDECKS).tap{|c| c.delete_at c.index(upcard)}

score_count = [0]*27
cards = []
N=(ARGV[2]||100_000).to_i
N.times{
 cards = CARDS.dup.shuffle if cards.size < 17
 dealer = [upcard]
 dealer << cards.pop while dealer.score < 17
 score_count[dealer.score] += 1
}

puts %w[17 18 19 20 21 bust].join('     ')
puts (score_count[17..21] << score_count[22..-1].inject(:+)).map{|x|
'%-4.1f%%  ' % (100.0*x / N )}.join