Nach meinen Wünschen sortieren

Hey,

hätte mal ne frage.

Ich habe einen array

var array = ["20",  "15", "15", "8", "8", "9", "10"]

nun möchte ich dass sich meine Arrays so anordnen dass sie in der Summe so nah wie möglich an 30 rankommen.

z. B. so:
20 + 10 = 30;
15 + 15 = 30;
9 + 8 + 8 = 25;

So sind die Arrays so angeordnet dass sie so wenig wie möglich Rest erzeugen.

Deshalb möchte ich dass sich die Arrays in dieser Reihenfolge anordnen:

"20", "10", "15", "15", "9", "8", "8"

Ich hoffe ich konnte es verständlich genug beschreiben und es nicht ganz so kompliziert ist.

Freddy

Was ist dein Ansatz? Eine vorgefertigte Methode für sowas wird es wohl kaum geben

  1. macht es nicht unbedingt Sinn, Zahlen als Strings in ein Array zu schreiben.
  2. wo ist die Logik für die gewünschte Ausgabe?

Hat sich erledigt, habe einen anderen Weg gefunden.
Aber trotzdem Danke.

Freddy

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>