Не интересно с допуском!
Вот, раз уж я накидал, чтоб посмотреть, за сколько же оно считает, мож пригодится.

Код AS3:
public var C:Array = [102, 120, 125, 127, 131, 133, 139, 143, 160, 177, 199, 250, 256, 277, 321, 349, 351, 385, 387, 390];
public var sum:int = 100009;
public var A:Array;
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
A = new Array(sum + 1);
A[0] = 0;
C.sort(2);//сортируем по убыванию, чтоб самые длинные трубы использовались чаще всего
for (var i:int = 0; i < C.length; ++i) {
for (var j:int = 0; j <= sum - C[i]; ++j) {
if (A[j] != null && A[j + C[i]] == null) {
A[j + C[i]] = C[i];
if (j + C[i] == sum) {
printTubes();
return;
}
}
}
}
trace("not found");
}
private function printTubes():void {
var count:int = 0;
for (var i:int = sum; i > 0; i -= A[i]) {
count += A[i];
trace("труба длиной "+A[i]+" метраж "+count);
}
A = null;
//trace(count);
}
Ссылка на сайт интересна в плане, что не олимпиада какая.