Ceci est une question d'entrevue facebook que j'ai rencontrée sur un portail en ligne. P>
Étant donné un ensemble S, trouvez tous les sous-ensembles maximaux dont la somme <= k. Par exemple, si S = {1, 2, 3, 4, 5} et k = 7 La sortie est: {1, 2, 3} {1, 2, 4} {1, 5} {2, 5} {3, 4} P>
Astuces: P>
Des idées Comment cela pourrait-il être résolu? P>
6 Réponses :
J'ai une idée - vous avez besoin d'un arbre. P>
Si vous avez donné une entrée de Ainsi, les nœuds à partir de 5 seraient: 5-1 strong> / 5-2 strong> - Seuls ceux-ci 2 ont une somme <= 7 p>
À partir de 4: 4-3 strong> / 4-2-1 strong> / 4-1 (sous-ensemble de précédent) p>
À partir de 3: 3-2-1 fort> / 3-1 (sous-ensemble de précédent) p>
à partir de 2: 2-1 (sous-ensemble de 3-2-1) P>
à partir de 1: 1 (sous-ensemble de 2-1) p>
Ensuite, vous pouvez trier les sorties valides et obtenir {1, 2, 3} {1, 2, 4} {1, 5} {2, 5} {3, 4} P> {1, 2, 3, 4, 5} code>, et vous recherchez des sous-ensembles maximaux - vous devez construire une arborese à partir des plus grands nombres, et toujours Développez
pendant que somme <= k code> (alors ne vous arrêtez pas sur 4-2, mais descendez à 1 pour obtenir 4-2-1). P>
Pouvez-vous s'il vous plaît proposer un algorithme ??
Nous enregistrons les nœuds contenant les sous-ensembles (satisfaisant la règle <= 7) dans une pile ou une file d'attente ou une matrice et éliminez les doublons et imprimez le tableau.
Ceci est un problème de Powerset. Récemment, j'ai trouvé Ce site sur les algorithmes et il fait fondre mon imagination: d'où la solution Powerset / Combinaisons suit. Vous pouvez simplement copier, coller et exécuter le programme.
@Raman Bhatia est là une raison pour laquelle vous n'avez pas accepté cette réponse? heureux de vous aider.
Cette solution semble très complexe et difficile à comprendre avec des commentaires / explications supplémentaires
Je suis désolé d'avoir une copie si tard. Mais que diriez-vous de faire cela? p>
1) Construisez une structure de tas min-thep à partir du tableau / réglage donné P>
2) Traverser la structure de la racine et continuez à soustraire la valeur au nœud que vous visitez. Une fois que vous avez dépassé la somme requise (curr_sum> k), émettez ce chemin de retour sur le parent et prenez un autre chemin (cela peut être effectué de manière récursive). P>
3) Si la récupération de retour vous ramène au nœud d'origine que vous avez démarré, implémentez l'ensemble de l'algorithme de Root-> Nœud gauche. P>
4) Faites deux étapes (2) et (3) ci-dessus mais avec un tas de max-max maintenant. p>
Je suis nouveau dans les algorithmes et les structures de données, et je n'ai commencé que de lire Intro à Algos-Cormen. Cela pourrait être une solution défectueuse, mais je serais plus qu'heureux si quelqu'un sort de la faute pour moi :) p>
Je sais qu'il est tard pour répondre, mais je pense avoir trouvé une solution simple à ce problème. Nous énumérons des sous-ensembles de Lorsque la somme code> dépasse code> > k code>, la pièce intéressante vient: Nous devons vérifier si le sous-ensemble une solution est de garder tout le Des sous-ensembles signalés et vérifient l'inclusion, mais c'est gaspillé. P> Au lieu de cela, nous calculons la différence entre le Voici le programme de travail complet dans un ancien C ++, démontrant l'idée: p> La sortie est tout sous-sols maximum dans l'ordre lexicographique, une par ligne: p> S code> dans l'ordre lexicographique à l'aide de la backtracking et de vérifier la somme
du sous-ensemble généré jusqu'à présent.
généré code> est un sous-ensemble approprié d'éléments signalés précédemment. p>
k code> et la somme
. / code>. S'il y a un élément
E code> dans
s code> tel que
e pas dans le sous-ensemble code> et
e <= (k - somme) code >, alors, l'ensemble que nous avons généré est un sous-ensemble approprié d'un sous-ensemble précédemment rapporté, et nous pouvons sauter en toute sécurité. P>
Une ancienne question mais toujours intéressante.
Voici une solution Java 8 récursive, avec une approche "permutationnelle". p>
optimisé pour un code plus propre et plus court plutôt que des performances - par exemple le Le tri et la taille ne devraient avoir lieu qu'une fois. p> pour le tester: p> public static void main(String[] args) {
new SubsetFinder()
.findSubsets(ImmutableList.of(1, 2, 3, 4, 5), 7)
.forEach(System.out::println);
}
L'algorithme est le suivant:
solution de travail sur Java est ci-dessous: p>
peut
s code> contenir une valeur répétée? tels que
s = {1, 2, 3, 3, 4, 5} code>?
@Seph, non, c'est
définir code> = pas de duplicates