Suppression d'entiers

Fermé
pudya - Modifié le 3 nov. 2017 à 13:52
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 3 nov. 2017 à 15:48
Bonjour,
j'ai le programme ci-dessous qui donne les entiers dont la somme est supérieure ou égale à un entier donné. je souhaiterais supprimer le minimum d'entiers dont la somme
est supérieure ou égale à l'entier donné.

merci pour l'aide

import java.util.ArrayList;
import java.util.Arrays;

public class AlgoCombSomComp {
    static void sum_up_recursive(ArrayList<Integer> numbers, int target, ArrayList<Integer> partial) {
       int s = 0;
       for (int x: partial) s += x;
              
       if (s >= target)
        
 System.out.println("sum("+Arrays.toString(partial.toArray())+")="+s + " THE target IS = " +target);
              
       for(int i=0;i<numbers.size();i++) {
             ArrayList<Integer> remaining = new ArrayList<Integer>();
             int n = numbers.get(i);
             
             for (int j=i+1; j<numbers.size();j++) remaining.add(numbers.get(j));
             
             ArrayList<Integer> partial_rec = new ArrayList<Integer>(partial);
             partial_rec.add(n);
                        
             sum_up_recursive(remaining,target,partial_rec);
             
       }
    }
    static void sum_up(ArrayList<Integer> numbers, int target) {
        sum_up_recursive(numbers,target,new ArrayList<Integer>());
    }

    
    public static void main(String args[]) {
        Integer[] numbers = {3,8,9,4,5};
        int target = 18;
        sum_up(new ArrayList<Integer>(Arrays.asList(numbers)),target);
    }
}


Output
sum([3, 8, 9])=20 THE TARGET IS = 18
sum([3, 8, 9, 4])=24 THE TARGET IS = 18
sum([3, 8, 9, 4, 5])=29 THE TARGET IS = 18
sum([3, 8, 9, 5])=25 THE TARGET IS = 18
sum([3, 8, 4, 5])=20 THE TARGET IS = 18
sum([3, 9, 4, 5])=21 THE TARGET IS = 18
sum([8, 9, 4])=21 THE TARGET IS = 18
sum([8, 9, 4, 5])=26 THE TARGET IS = 18
sum([8, 9, 5])=22 THE TARGET IS = 18
sum([9, 4, 5])=18 THE TARGET IS = 18


dans ce cas par exemple, je supprimerai 9, 4, 5 et j'aurai dans {3, 8, 18}
A voir également:

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
3 nov. 2017 à 15:48
Bonjour,

Comme je l'ai déjà indiqué dans ta discussion précédente, tu devrais trier tes entiers par ordre croissant.

public static List<Integer> delete(Collection<Integer> numbers, int target) {
    LinkedList<Integer> temp = new LinkedList<>(numbers);
    Collections.sort(temp);
    LinkedList<Integer> result = new LinkedList<>();
    for (int sum = 0, next; sum < target && !temp.isEmpty(); sum += next) {
        next = temp.removeLast();
        result.addFirst(next);
    }
    return result;
}

public static void main(String[] args) {
    List<Integer> result = delete(Arrays.asList(3, 8, 9, 4, 5), 18);
    System.out.println(result); // [5, 8, 9] car 5+8+9=22 > 18
}

Remarque : pour optimiser cette méthode sur un grand nombre de valeurs il faudrait privilégier l'utilisation de Collections.sort avec une ArrayList.
0