ich hab aus interesse mal versucht wie man das lösen könnte, hier mal meine Lösung dazu (Verbesserungsvorschläge gern gesehen)
<html>
<head>
<title>test</title>
<script type="text/javascript">
//prueft obs ein int ist
function isInt(n){
return typeof n== "number" && isFinite(n) && n%1===0;
}
//aufsteigend sortieren
function Numsort (a, b) {
return a - b;
}
function sort_array(){
var array = [20, 15, 15, 8, 8, 9, 10];
array.sort(Numsort);
array.reverse();//array "umdrehen"
var done = false;
var new_array = new Array(array.length);
var new_index = 0;
var naeherungswert = 30;
var check = false;
while(!done){
//wenn man hier bei 0 ist fuellt er noch ggf. nullen im array auf weil utnen ja alles hittet (0+0=0) und ist dann done
if(naeherungswert == 0){
done = true;
}
for(var i = 0;i < array.length;i++){
for(var j = (i +1);j < array.length;j++){
if(array[i] + array[j] == naeherungswert){//wenns den naeherungswert erreicht ins neue array schreiben
new_array[new_index] = array[i];
new_array[(new_index + 1)] = array[j];
new_index += 2;
array[i] = null;
array[j] = null;
}
}
}
//hier koennte man eig direkt done befuellen, aber wenn man mal bis 0 kommt und
//aus irgend nem grund noch iwo kein int drin ist gibts dann ne endlosschleife,
//weil er done wieder auf false setzt
for(var test = 0;test < new_array.length;test++){
if(isInt(new_array[test])){
check = true;
}else{
check = false;
}
}
//desswegen erst hier auf done
if(check){
done = true;
}else{
naeherungswert -= 1;//sonst einfach "einen schritt weiter"
}
}
//wollte das irgendwo reinschreiben, man kann hier sonst natürlich auch einfach n array draus machen
for(var k = 0;k < new_array.length;k++){
if(new_array[k] != null){//falls sich da mal von oben n null rein verirrt
document.getElementById('test').innerHTML += new_array[k];
}
}
}
</script>
</head>
<body onload="sort_array()"><p id="test"></p></body>
</html>