IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Algorithme somme max à atteindre


Sujet :

avec Java

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 259
    Points : 128
    Points
    128
    Par défaut Algorithme somme max à atteindre
    J'ai une liste ou un tableau qui contient par exemple[0,8,25,45,...] trié,et un nombre par exemple 156.
    Je cherche un algo qui me permettrait de déterminer quels sont les nombres que je dois enlever(les min possibles) à mon tableau pour la somme des nombres du tableau soient inférieure à 156

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 657
    Points
    2 657
    Par défaut
    Le but de ce forum n'est pas de te donner la solution toute prête.

    Et quel est ta difficulté sur cet algo? Qu'as tu déjà comme idée d'algo?

    Un algo de type glouton sans subtilité est possible déjà.

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 259
    Points : 128
    Points
    128
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    int myfunction(int[] tab,int subTT) {
    	int sum = 0;
    	for (int i = 0; i < tab.length; i++) {
    		 sum = sum + tab[i];
    	}
    	for (int i = 0; i < tab.length; i++) {
    		if(sum-tab[i]<subTT){
    			return tab[i];
    		}
    	}
    	return sum;
      // il se peut la première boucle ne suffise pas pour trouver le nombre 
      // et qu'il faut soustraire deux nombres
    }

  4. #4
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 259
    Points : 128
    Points
    128
    Par défaut
    J'ai trouvé cela comme le rendre plus général?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    int[] myfunction(int[] tab, int subTT) {
    		int sum = 0;
    		for (int i = 0; i < tab.length; i++) {
    			sum = sum + tab[i];
    		}
    		for (int i = 0; i < tab.length; i++) {
    			if (sum - tab[i] < subTT) {
    				int []returnTab = new int[1];
    				returnTab[0] = tab[i];
    				return returnTab;
    			}
    		}
     
    		for (int i = 0; i < tab.length; i++) {
    			for (int j = 1; j < tab.length; j++) {
     
    				if(sum-(tab[i]+tab[j])<subTT){
     
    					int []returnTab = new int[2];
    					returnTab[0] = tab[i];
    					returnTab[1] = tab[j];
    					return returnTab; 
    				}
     
    			}
    		}
    		return null;
     
     
    	}

  5. #5
    Membre expert Avatar de Kearz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2012
    Messages : 856
    Points : 3 659
    Points
    3 659
    Par défaut
    Soit j'ai pas compris le problème, soit tu n'y réponds pas du tout.

    T'as bien un tableau t et tu veux que la somme de t soit inférieur à un entier x.
    Si la somme des éléments t est supérieur à x tu retire des éléments du tableau jusqu'à ce que ça soit bon.
    Le but est d'en retirer un minimum, de retourner le tableau et en plus le tableau est trié.

    C'est ça?

    Si c'est bien ça:

    Tu récupère la somme du tableau, donc pour la première boucle pas de problème.

    Mais là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for (int i = 0; i < tab.length; i++) {
    	if(sum-tab[i]<subTT){
    		return tab[i];
    	}
    }
    Tu retourne uniquement l'élément du tableau qui permettrait d'atteindre ça. Mais s'il faut en retirer plusieurs, ça marchera jamais.

    Déjà, avant de rentrer dans la boucle, il serait bien de vérifier que les conditions sont pas déjà valide. (Sum<subTT) -Ou passer par un while-

    Ensuite, comme tu veux en retirer un minimum est que ton tableau est trier, il faut commencer par les plus gros chiffre donc par la fin.
    Donc tu commence par la fin, et tu boucle:
    La somme du tableau - le dernier élément. Tu vire le dernier élément et tu sauvegarde la nouvelle somme. Et tu regarde si les conditions sont bonnes. (Si oui, hop t'as fini. Si non, tu reboucle.)



    PS: je me suis basé sur ton idée, moi je partirais en regardant l'écart subTT/sum. Et après je ferais une somme en commençant par la fin.


    EDIT: J'avais pas vu ton deuxième message, surement écrit pendant que j'écrivais le mien. J'ai pas le temps de regarder mais ça me semble complexe. (double boucle imbriquée, etc, ...)
    Enfin, si ça marche, tant mieux.

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Points : 2 657
    Points
    2 657
    Par défaut
    Citation Envoyé par Kearz Voir le message
    EDIT: J'avais pas vu ton deuxième message, surement écrit pendant que j'écrivais le mien. J'ai pas le temps de regarder mais ça me semble complexe. (double boucle imbriquée, etc, ...)
    Enfin, si ça marche, tant mieux.
    ça me semble aussi inutilement complexe mais bon a lui de voir ce qui lui faut.

Discussions similaires

  1. [Aide] Performances de mon algorithme min-max
    Par moithibault dans le forum Intelligence artificielle
    Réponses: 1
    Dernier message: 16/02/2013, 01h22
  2. Algorithme Min-Max appliqué au jeu Puissance 4 en C .
    Par hebmaster dans le forum Intelligence artificielle
    Réponses: 17
    Dernier message: 29/10/2012, 07h33
  3. Algorithme Min-Max en C appliqué au jeu de Morpion (Tic-Tac-Toe)
    Par crooss dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 02/01/2012, 16h41
  4. Parallélisation de l'algorithme Min Max
    Par on2101 dans le forum Intelligence artificielle
    Réponses: 0
    Dernier message: 08/02/2011, 21h08
  5. Algorithme Somme
    Par chateau_dur dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 07/12/2005, 07h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo