Derive Your Dreams

about me
Twitter: @kinaba

21:25 08/10/27

論文






 

100 3

17:12 08/10/24

アルゴリズムコンテストの挑み方 (2)




3


 "Small Change" Anarchygolfania () Anarchygolfania 17121472

/使  12+1+1 3


 C[0], C[1], ..., C[N-1] 

T

 P[0], P[1], ..., P[M-1] 






  




 T T-1   T  T-1T 1

T-1   T-2  () 3  2  1  0  

1712T T-1 + 1  T-7 + 7  T-12 + 12 
opt[T] =                         # T円の最適な払い方は
     C.select{|c| opt[T-c]}.
          map{|c| opt[T-c]+[c]}. #   T-c円の最適な払い方 + c円玉
       min_by{|p| p.size}        #   … のうち一番枚数少ないヤツ

T-1 T-2 
...
opt[T-2] =                         # T-2円の最適な払い方は
     C.select{|c| opt[T-2-c]}.
          map{|c| opt[T-2-c]+[c]}. #   T-2-c円の最適な払い方 + c円玉
       min_by{|p| p.size}          #   … のうち一番枚数少ないヤツ

opt[T-1] =                         # T-1円の最適な払い方は
     C.select{|c| opt[T-1-c]}.
          map{|c| opt[T-1-c]+[c]}. #   T-1-c円の最適な払い方 + c円玉
       min_by{|p| p.size}          #   … のうち一番枚数少ないヤツ

opt[T] =                         # T円の最適な払い方は
     C.select{|c| opt[T-c]}.
          map{|c| opt[T-c]+[c]}. #   T-c円の最適な払い方 + c円玉
       min_by{|p| p.size}        #   … のうち一番枚数少ないヤツ



opt    = {} # opt[t] はt円の最適な払い方。これから求めるよ!
opt[0] = [] # 0円 はコイン0枚で最適に(?)払えます
1.upto(T) do |t|
  opt[t] =                       # t円の最適な払い方は
     C.select{|c| opt[t-c]}.
          map{|c| opt[t-c]+[c]}. #   t-c円の最適な払い方 + c円玉
       min_by{|p| p.size}        #   … のうち一番枚数少ないヤツ
end
p opt[T]

1




 T  N 

C[0] .. C[N-2] 使T C[0] .. C[N-1] 使T  C[N-1]  

N C[0] .. C[N-3]T C[0] .. C[N-4]T C[0] T

T C[0] .. C[N-2] 使012T-1T

opt = [[]] # コインを1種類も使わない場合、0円だけは払えます。他は払えません
C.each_with_index do |c, n| # c==C[n] 番目までのコインだけを使う0円と1円と(中略)T円の払い方は…
  opt = (0..T).map do |t|
    (0..t/c).select{|k| opt[t-c*k]}.
                map{|k| opt[t-c*k] + [c]*k}. # C[n-1]までを使った t-c*kの最適な払い方 + c円玉をk
             min_by{|p| p.size}              #   … のうち一番枚数少ないヤツ
  end
end
p opt[T]

2




 C[1] 7667

 C[i], N, T   M 

MTM MT

M-1 TMT 01M-1 M

TM-1  M

payable_by_m = {0 => []} # 0枚で払える金額一覧 == 0円:[]
0.upto(T) do |m|
  if payable_by_m[T]   # Tがm枚で払えるならそれが答え
     p payable_by_m[T]
     break
  end

  payable_by_m_plus_1 = {} # m+1枚で払える金額一覧を計算…
  payable_by_m.each do |money, howto| # m枚あればmoney円を払えて
    C.each do |c|                     # c円玉が存在するならば
      payable_by_m_plus_1[money+c] = howto+[c] # m+1枚でmoney+c円を払える
    end
  end
  payable_by_m = payable_by_m_plus_1
end

3 Tmoney+c >T  payable_by_...money, howto moneypayable_by_...




 1



 (DP / Dynamic Programming)  3  (+)

NT /   TT 調


つづき

23:26 08/10/22

ほん


   Wiz ()  Amazon 

   """"  "For your eyes only"  ""

20:24 08/10/17

にほん


5

10 Sebastian 


     "Macro Tree Transducer" 調調  [PPT]

POPL  Accepted Papers Morihata-Matsuzaki  ICFPPOPL   "Bidirectionalization for Free!"    

19:55 08/10/09

Physical


m0h1canTwitter  "Little Big Computer"

Little Big Planet  PS3  "electronic" (not "mechanical")   "electronic"  "magnetic switches" 

18:45 08/10/06

いろいろ


 "Clueless Crossword"  /

Windows9 8


presented by k.inaba (kiki .a.t. kmonos.net) under CC0