### Ruby, 136 characters ### a,*b=*$< c=->s,u,e{f,*r=e;f ?(0..s/h=f.to_i).map{|n|c[s-n*h,u+[n.to_s+f[/ .*/]],r]}:s>0?[]:u*?,} r=c[a.to_i,[],b].flatten puts r[0]?r:?X Input must be given on STDIN, one line for the total amount and then one line per item (weight, followed by space, followed by name). Example input: 250 35 Portal 2 21 Minecraft 12 Braid Output: 2 Portal 2,0 Minecraft,15 Braid 2 Portal 2,4 Minecraft,8 Braid 2 Portal 2,8 Minecraft,1 Braid 5 Portal 2,3 Minecraft,1 Braid