安いほうから順に 個を選ぶことを考えてみます。
各種類を1つだけ買った時の価格を集合に加えます。
集合の中から一番安い価格を取り出します。
その価格に、さらに1つ追加で買うときの価格をに加えます。
は同じ値の重複を許さないようにして、から一番安い価格を取り出し、一つ追加した価格を加えることを繰り返したとき、回目に取り出した価格が求める答えです。
コード例 (Julia)
using DataStructures function solve() # 入力 readInts() = parse.(Int,split(readline())) readInt() = parse(Int,readline()) N,K = readInts() A = readInts() s = SortedSet{Int}() for i = 1:N push!(s,A[i]) end for i = 1:K-1 c = pop!(s) for j = 1:N push!(s,c+A[j]) end end println(pop!(s)) end # function solve # main solve()