f=->(d,v){d<0?0:(a=v.select{|x|x[d]>0})[0]&&(v-=a)[0]?2**d+[f[d-=1,a],f[d,v]].min: f[d-1,v]} gets p f[30,gets.split.map(&:to_i)]