Maison Java javaDidacticiel Exemples détaillés de problèmes de somme de sous-ensembles

Exemples détaillés de problèmes de somme de sous-ensembles

Jul 03, 2017 am 11:03 AM
动态规划 sous-ensemble 问题

Remarque : étant donné que l'étude du "Problème de somme de sous-ensembles" n'est pas suffisamment approfondie, cet article peut contenir des descriptions peu claires ou des erreurs dans l'explication de la formule de récursion de programmation dynamique. Si vous en trouvez, j'espère. vous pouvez, n'hésitez pas à m'apprendre.

Le problème de la somme des sous-ensembles peut être décrit comme suit : Étant donné n entiers positifs W=(w1, w2, …, wn) et l'entier positif M sont nécessaires pour trouver tel Un sous-ensembleI⊆{1, 2, 3, ..., n},tel que∑wi=M,i∈I[1] . Prenons un exemple pour donner une explication populaire du problème de la somme des sous-ensembles : définir W=(1, 2, 3, 4, 5), étant donné un entier positif M = 5, existe-t-il un sous-ensemble I de W, tel que le sous-ensemble La somme des éléments dans I est égale à M Dans cet exemple, il y a évidemment un sous-ensemble I=(2, 3).

Définition du problème : L'ensemble des entiers positifs S=(w1, w2, w3, …, wn), étant donné Entier positif W, s[i, j] dans i signifie S est un sous-ensemble, et j représente la somme des sous-ensembles i. Si la somme des éléments S d'un ensemble i est j=M , Autrement dit, le problème a une solution.

Exemple : S=(7, 34, 4, 12, 5, 3), W=6, qu'il existe un sous-ensemble de S, la somme de ses éléments est égale à W.

Il existe également de nombreuses solutions à ce problème. Dans cet article, l'idée de programmation dynamique est utilisée pour résoudre, puis une formule récursive doit être dérivée. On divise continuellement l'ensemble S en petits ensembles. C'est la première étape de la programmation dynamique : définir le sous-problème . Le plus petit ensemble de l'ensemble S est l'ensemble vide Bien entendu, l'ensemble vide n'existe pas. La somme de ses éléments est égale à W<.> Bien sûr, si j=0L'ensemble vide est éligible.

Les colonnes de ce tableau représentent la somme des éléments de l'ensemble. Elle ne peut atteindre que l'élément W au maximum. Cela n'a bien sûr aucun sens s'il est supérieur à . W . Tant que 1 apparaît dans la colonne j=6, la solution au problème est obtenue. La ligne représente un sous-ensemble composé des premiers éléments i (y compris i) (cette phrase peut être un peu douteuse, n'est-ce pas Vous ne parvenez pas à tout scanner ? i=0 représente l'ensemble vide.

Lorsque nous définissons j=6, la situation d'ensemble vide est vrai. Ensuite, lorsque j=0, cela est vrai pour toute somme de sous-ensemble (l'ensemble vide est leur sous-ensemble). Le formulaire continue donc à se remplir comme indiqué ci-dessous.

Il s'agit en fait de la troisième étape de la programmation dynamique : définir l'état initial. La deuxième étape de la planification des États consiste à définir les règles de transition des États, c’est-à-dire la relation récursive entre les États.

Le i dans s[i, j] représente le premier i Le le sous-ensemble ( comprend i). En fait, on le divise en deux parties à partir d'ici :

 1) En excluant le premier ii 🎜> sous-ensemble, c'est-à-dire s[i - 1, j]

2) Inclut le

i Le premier i sous-ensemble d'éléments. Il est plus facile de comprendre le cas 1)
La somme des premiers i - 1 éléments de l'ensemble est égale à. j, alors la somme des premiers i éléments de l'ensemble est égale à j .

Ce qui est difficile à comprendre, c'est la situation 2). Une chose qui peut être claire à propos du deuxième cas est que i dans s[i, X] est certain, et le la clé est j, j Comment le définir à ce moment ? En utilisant la «Méthode des valeurs spéciales» en mathématiques, prenons l'exemple (3, 34, 9 ), existe-t-il un sous-ensemble donné dont la somme des éléments est égale à 37, à cet instant i=2 (le sous-ensemble est (3, 34)), j = 37, à ce moment " Y compris le premier i sous-ensemble " du i element Dans le cas, s[2, 37] => s[2, 37 - 34] = s[2, 3], sous-ensemble (3, 34) Bien sûr il existe un sous-ensemble dont la somme des éléments est égale à 3. Alors si j = 36, s[2, 36] => >, le sous-ensemble (3, 34) n'existe évidemment pas et la somme de ses éléments de sous-ensemble est égale à 2. Qu'en est-il de j = 1, s[2, 1] => 🎜>, j - wi <0, à ce moment s[2, 1] => ] = s[1, 1], sous-ensemble (3) Évidemment il n'y a pas de sous-ensemble dont la somme des éléments est égale à 1 . En résumé, la formule récursive est la suivante :

Avant d'utiliser du code pour implémenter cet algorithme, remplissez d'abord ce qui précède via le récursif matrice de formule.

 ①i = 1,

Le sous-ensemble à ce moment est

(7), j = 1 , j ∉ (∅), condition de sélection 2) => (i = 0 représente l'ensemble vide). Évidemment s[1, 1] = 0.

 ②i = 1, Le sous-ensemble à ce moment est (7), j = 2, j ∉ (∅) , situation de sélection 2) => s[0, 2] || s[1, -5](i = 0 représente l'ensemble vide). Évidemment s[1, 2] = 0.

 ⑥i = 1, à ce moment le sous-ensemble est (7), j = 6, j ∉ (∅), condition de sélection 2) => s[0, 6] || , -1] (i = 0 représente l'ensemble vide). Évidemment s[1, 6] = 0.

Le remplissage final est comme indiqué ci-dessous :

Continuer à remplir See More dans la dernière ligne :

①i = 6, Le sous-ensemble à ce moment est (7, 34, 4, 12, 5, 3) , j = 1, j ∉ (7, 34, 4, 12, 5), situation de sélection 2) => ; s[5, 1] ​​​​|| s[6, -2] (i = 0 représente l'ensemble vide) . Évidemment s[6, 1] = 0.

 ②i = 6, Le sous-ensemble à ce moment est (7, 34, 4, 12, 5, 3), j = 2, j ∉ (7, 34, 4, 12, 5), situation de sélection 2) => , 1] || s[6, -1] (i = 0 représente l'ensemble vide). Évidemment s[6, 2] = 0.

 ③i = 6, Le sous-ensemble à ce moment est (7, 34, 4, 12, 5, 3), j = 3, j ∉ (7, 34, 4, 12, 5), cas de sélection 2) => ​​| Évidemment s[6, 3] = 1.

...

 ⑥i = 6, Le sous-ensemble à ce moment est (7, 34, 4, 12, 5 , 3), j = 6, j ∉ (7, 34, 4, 12, 5), situation de sélection 2) => s[5, 6] || 🎜>. Évidemment s[6, 6] = 1.

Java

 1 package com.algorithm.dynamicprogramming; 2  3 import java.util.Arrays; 4  5 /** 6  * 子集和问题 7  * Created by yulinfeng on 7/2/17. 8  */ 9 public class SubsetSumProblem {10 11     public static void main(String[] srgs) {12         int[] sets = {7, 34, 4, 12, 5, 3};13         int sum = 87;14         boolean isExistSubSet = subsetSumProblem(sets, sum);15         System.out.println("集合" + Arrays.toString(sets) + "是否存在子集的和等于" + sum + ":" + isExistSubSet);16     }17 18     private static boolean subsetSumProblem(int[] sets, int sum) {19         int row = sets.length + 1;20         int col = sum + 1;21         int[][] solutionMatrix = new int[row][col];22         solutionMatrix[0][0] = 1;23 24         /**25          *    0 1 2 3 4 5 626          * 0 |1|0|0|0|0|0|0|27          * 1 |x|x|x|x|x|x|x|28          * 2 |x|x|x|x|x|x|x|29          * 3 |x|x|x|x|x|x|x|30          * 3 |x|x|x|x|x|x|x|31          * 4 |x|x|x|x|x|x|x|32          * 5 |x|x|x|x|x|x|x|33          * 6 |x|x|x|x|x|x|x|34          */35         for (int i = 1; i < col; i++) {36             solutionMatrix[0][i] = 0;37         }38         /**39          * 初始状态40          *    0 1 2 3 4 5 641          * 0 |1|0|0|0|0|0|0|42          * 1 |1|0|x|x|x|x|x|43          * 2 |x|x|x|x|x|x|x|44          * 3 |x|x|x|x|x|x|x|45          * 3 |x|x|x|x|x|x|x|46          * 4 |x|x|x|x|x|x|x|47          * 5 |x|x|x|x|x|x|x|48          * 6 |1|0|0|x|x|x|x|49          * [i][0] = 1,按行填充50          */51         for (int i = 1; i < row; i++) {52             solutionMatrix[i][0] = 1;53             for (int j = 1; j < col; j++) {54                 solutionMatrix[i][j] = solutionMatrix[i - 1][j];55 56                 if (solutionMatrix[i][j] == 1) {57                     solutionMatrix[i][j] = solutionMatrix[i][j];58                 } else if ( j - sets[i - 1] >= 0 && solutionMatrix[i][j - sets[i - 1]] == 1) {59                     solutionMatrix[i][j] = solutionMatrix[i][j - sets[i - 1]];60                 } else {61                     solutionMatrix[i][j] = 0;62                 }63 64                 if (j == col - 1 && solutionMatrix[i][j] == 1) {65                     return true;66                 }67             }68         }69 70         return false;71     }72 }
Copier après la connexion

  Python3

 1 def subset_sum_problem(sets, sum): 2     row = len(sets) + 1 3     col = sum + 1 4     solutionMatrix = [[0 for col in range(col)] for row in range(row)] 5     solutionMatrix[0][0] = 1 6     for i in range(1, col): 7         solutionMatrix[0][i] = 0 8  9     for j in range(1, row):10         solutionMatrix[j][0] = 111         for k in range(1, col):12             solutionMatrix[j][k] = solutionMatrix[j - 1][k]13             if solutionMatrix[j][k] == 1:14                 solutionMatrix[j][k] = solutionMatrix[j][k]15             elif (k - sets[j - 1] >= 0) and (solutionMatrix[j][k - sets[j - 1]] == 1):16                 solutionMatrix[j][k] = solutionMatrix[j][k - sets[j - 1]]17             else:18                 solutionMatrix[j][k] = 019             if k == col - 1 and solutionMatrix[j][k] == 1:20                 return True21 22     return False23 24 sets = [7, 34, 4, 12, 5, 3]25 num = 626 is_exist = subset_sum_problem(sets, num)27 print(is_exist)
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Résoudre le problème « erreur : redéfinition de la classe 'ClassName' » qui apparaît dans le code C++ Résoudre le problème « erreur : redéfinition de la classe 'ClassName' » qui apparaît dans le code C++ Aug 25, 2023 pm 06:01 PM

Résolvez le problème « erreur : redéfinition de la classe 'ClassName » dans le code C++. Dans la programmation C++, nous rencontrons souvent diverses erreurs de compilation. L'une des erreurs courantes est "error: redefinitionofclass 'ClassName'" (erreur de redéfinition de la classe 'ClassName'). Cette erreur se produit généralement lorsque la même classe est définie plusieurs fois. Cet article sera

Problèmes d'évaluation de l'effet de clustering dans les algorithmes de clustering Problèmes d'évaluation de l'effet de clustering dans les algorithmes de clustering Oct 10, 2023 pm 01:12 PM

Le problème d'évaluation de l'effet de clustering dans l'algorithme de clustering nécessite des exemples de code spécifiques. Le clustering est une méthode d'apprentissage non supervisée qui regroupe des échantillons similaires dans une seule catégorie en regroupant les données. Dans les algorithmes de clustering, la manière d’évaluer l’effet du clustering est une question importante. Cet article présentera plusieurs indicateurs d'évaluation de l'effet de clustering couramment utilisés et donnera des exemples de code correspondants. 1. Indice d'évaluation de l'effet de clustering Coefficient Silhouette Le coefficient Silhouette évalue l'effet de clustering en calculant la proximité de l'échantillon et le degré de séparation des autres clusters.

Comment écrire un algorithme de programmation dynamique en utilisant C# Comment écrire un algorithme de programmation dynamique en utilisant C# Sep 20, 2023 pm 04:03 PM

Comment utiliser C# pour écrire un algorithme de programmation dynamique Résumé : La programmation dynamique est un algorithme courant pour résoudre des problèmes d'optimisation et convient à une variété de scénarios. Cet article explique comment utiliser C# pour écrire des algorithmes de programmation dynamique et fournit des exemples de code spécifiques. 1. Qu'est-ce qu'un algorithme de programmation dynamique ? La programmation dynamique (DP) est une idée algorithmique utilisée pour résoudre des problèmes avec des sous-problèmes qui se chevauchent et des propriétés de sous-structure optimales. La programmation dynamique décompose le problème en plusieurs sous-problèmes à résoudre et enregistre la solution à chaque sous-problème.

Apprenez à diagnostiquer les problèmes courants de l'iPhone Apprenez à diagnostiquer les problèmes courants de l'iPhone Dec 03, 2023 am 08:15 AM

Connu pour ses performances puissantes et ses fonctionnalités polyvalentes, l’iPhone n’est pas à l’abri de contretemps ou de difficultés techniques occasionnelles, un trait commun aux appareils électroniques complexes. Rencontrer des problèmes avec votre iPhone peut être frustrant, mais aucune alarme n'est généralement nécessaire. Dans ce guide complet, nous visons à démystifier certains des défis les plus fréquemment rencontrés associés à l’utilisation de l’iPhone. Notre approche étape par étape est conçue pour vous aider à résoudre ces problèmes courants, en vous proposant des solutions pratiques et des conseils de dépannage pour remettre votre équipement en parfait état de fonctionnement. Que vous soyez confronté à un problème ou à un problème plus complexe, cet article peut vous aider à les résoudre efficacement. Conseils de dépannage généraux Avant de passer aux étapes de dépannage spécifiques, voici quelques conseils utiles

Comment résoudre le problème selon lequel jQuery ne peut pas obtenir la valeur de l'élément de formulaire Comment résoudre le problème selon lequel jQuery ne peut pas obtenir la valeur de l'élément de formulaire Feb 19, 2024 pm 02:01 PM

Pour résoudre le problème selon lequel jQuery.val() ne peut pas être utilisé, des exemples de code spécifiques sont requis. Pour les développeurs front-end, l'utilisation de jQuery est l'une des opérations courantes. Parmi eux, utiliser la méthode .val() pour obtenir ou définir la valeur d'un élément de formulaire est une opération très courante. Cependant, dans certains cas précis, le problème de ne pas pouvoir utiliser la méthode .val() peut se poser. Cet article présentera quelques situations et solutions courantes, et fournira des exemples de code spécifiques. Description du problème Lorsque vous utilisez jQuery pour développer des pages frontales, vous rencontrerez parfois

Analyse d'algorithme PHP : Comment utiliser un algorithme de programmation dynamique pour résoudre le problème de sous-chaîne palindrome la plus longue ? Analyse d'algorithme PHP : Comment utiliser un algorithme de programmation dynamique pour résoudre le problème de sous-chaîne palindrome la plus longue ? Sep 19, 2023 pm 12:19 PM

Analyse d'algorithme PHP : Comment utiliser un algorithme de programmation dynamique pour résoudre le problème de sous-chaîne palindrome la plus longue ? La programmation dynamique (programmation dynamique) est une idée d'algorithme couramment utilisée qui peut résoudre de nombreux problèmes complexes. L’un d’eux est le problème de la sous-chaîne palindrome la plus longue, qui consiste à trouver la longueur de la sous-chaîne palindrome la plus longue dans une chaîne. Cet article explique comment utiliser PHP pour écrire un algorithme de programmation dynamique afin de résoudre ce problème et fournit des exemples de code spécifiques. Définissons d’abord la sous-chaîne palindrome la plus longue. Une chaîne palindrome fait référence à une chaîne qui lit la même chose vers l'avant et vers l'arrière, et la chaîne palindrome

Comment utiliser l'algorithme du problème du sac à dos en C++ Comment utiliser l'algorithme du problème du sac à dos en C++ Sep 21, 2023 pm 02:18 PM

Comment utiliser l'algorithme du problème du sac à dos en C++ Le problème du sac à dos est l'un des problèmes classiques des algorithmes informatiques. Il implique la manière de sélectionner certains éléments à mettre dans le sac à dos en fonction d'une capacité donnée du sac à dos afin de maximiser la valeur totale des éléments. Cet article présentera en détail comment utiliser l'algorithme de programmation dynamique en C++ pour résoudre le problème du sac à dos et donnera des exemples de code spécifiques. Tout d’abord, nous devons définir l’entrée et la sortie du problème du sac à dos. L'entrée inclut le tableau de poids wt[] de l'article, le tableau de valeurs val[] de l'article et la capacité W du sac à dos. Le résultat est quels objets sont sélectionnés

Problème d'acquisition d'étiquettes dans l'apprentissage faiblement supervisé Problème d'acquisition d'étiquettes dans l'apprentissage faiblement supervisé Oct 08, 2023 am 09:18 AM

Le problème d'acquisition d'étiquettes dans l'apprentissage faiblement supervisé nécessite des exemples de code spécifiques Introduction : L'apprentissage faiblement supervisé est une méthode d'apprentissage automatique qui utilise des étiquettes faibles pour la formation. Différent de l’apprentissage supervisé traditionnel, l’apprentissage faiblement supervisé n’a besoin que d’utiliser moins d’étiquettes pour former le modèle, plutôt que chaque échantillon doit avoir une étiquette précise. Cependant, dans l’apprentissage faiblement supervisé, la manière d’obtenir avec précision des informations utiles à partir d’étiquettes faibles est une question clé. Cet article présentera le problème d'acquisition d'étiquettes dans l'apprentissage faiblement supervisé et donnera des exemples de code spécifiques. Introduction au problème d’acquisition de labels en apprentissage faiblement supervisé :

See all articles