Пример простой реализации(есть недочёты) на JS, но можно адаптировать на любой в принципе..
function wrap(liquid, cans){
let result = []
cans = cans.sort((a,b) => b - a)
//сортируем все банки по убыванию объёма
while(cans.length && liquid - cans[0] >= 0){
//пока есть пустая банка и её объём
//не превышает объём оставшийся краски
liquid -= cans[0]
//вычитаем объём банки
result.push(cans.splice(0,1)[0])
//выдираем банку из исходного массива
//и ложим в результирующий
}
while ( liquid > 0 ){
//пока ещё есть краска
cans = cans.sort((a,b) => Math.abs(liquid-b) - Math.abs(liquid-a))
//сортируем по принципу:
//самой последней должна быть банка,
//объём которой ближе объёму оставшейся краски
liquid -= cans[cans.length - 1]
//вычитаем объём банки
result.push(cans.pop())
//выдираем банку из исходного массива
//и ложим в результирующий
}
return result
}
let emptyCans = [15,7,10,12,10]
console.log(wrap(33,emptyCans))
//[15, 12, 7] - эти банки использованы
console.log(emptyCans)
//[10,10] - эти остались