Comment calculer la somme combinée à l'aide de l'algorithme de backtracking en PHP

醉折花枝作酒筹
Libérer: 2023-03-11 13:42:01
original
1985 Les gens l'ont consulté

Étant donné un tableau de candidats et un nombre cible, trouvez toutes les combinaisons de candidats qui peuvent faire en sorte que la somme des nombres soit cible. Que devons-nous faire à ce moment-là ? Aujourd'hui, je vais vous guider à travers cela.

Comment calculer la somme combinée à l'aide de l'algorithme de backtracking en PHP

Donner Définissez un tableau de candidats et un nombre cible, et recherchez toutes les combinaisons de candidats pouvant constituer la somme des nombres cibles.

Chaque numéro dans

candidat ne peut être utilisé qu'une seule fois dans chaque combinaison.

Remarque :

Tous les nombres (y compris le nombre cible) sont des entiers positifs. L'ensemble de solutions ne peut pas contenir de combinaisons en double.

Exemple 1 :

输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:[
 [1, 7],
 [1, 2, 5],
 [2, 6],
 [1, 1, 6]]
Copier après la connexion

Exemple 2 :

输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:[  
[1,2,2],  
[5]]
Copier après la connexion

Idées de résolution de problèmes

Référence directe au problème de permutation/combinaison/sous-ensemble annihilant le groupe d'algorithmes de retour en arrière

Code

class Solution {
    /** * @param Integer[] $candidates * @param Integer $target * @return Integer[][] */
    public $res = [];
    function combinationSum2($candidates, $target) {
        sort($candidates);   // 排序
        $this->dfs([], $candidates, $target, 0);
        return $this->res;
    }
    function dfs($array, $candidates, $target, $start) {
        if ($target < 0) return;
        if ($target === 0) {
            $this->res[] = $array;
            return;
        }
        $count = count($candidates);
        for ($i = $start; $i < $count; $i++) {
            if ($i !== $start && $candidates[$i] === $candidates[$i - 1]) continue;
            $array[] = $candidates[$i];
            $this->dfs($array, $candidates, $target - $candidates[$i], $i + 1);//数字不能重复使用,需要+1
            array_pop($array);
        }
    }}
Copier après la connexion

Extra :

Étant donné un tableau de candidats sans éléments en double et un nombre cible cible, trouvez toutes les combinaisons de candidats qui peuvent faire de la somme des nombres une cible.

Les nombres de candidats peuvent être sélectionnés à plusieurs reprises sans limite.

La différence est que les sélections répétées sont autorisées et elles sont résolues en effectuant deux modifications basées sur la question précédente.

class Solution {
    /** * @param Integer[] $candidates * @param Integer $target * @return Integer[][] */
    public $res = [];
    function combinationSum($candidates, $target) {
        sort($candidates);   // 排序
        $this->dfs([], $candidates, $target, 0);
        return $this->res;
    }
    function dfs($array, $candidates, $target, $start) {
        if ($target < 0) return;
        if ($target === 0) {
            $this->res[] = $array;
            return;
        }
        $count = count($candidates);
        for ($i = $start; $i < $count; $i++) {
            // if ($i !== $start && $candidates[$i] === $candidates[$i - 1]) continue; // 注释掉去重的代码
            $array[] = $candidates[$i];
            $this->dfs($array, $candidates, $target - $candidates[$i], $i);//数字能重复使用, 不需要+1
            array_pop($array);
        }
    }}
Copier après la connexion

Extra :

Trouvez toutes les k combinaisons de nombres dont la somme est n. Seuls les entiers positifs de 1 à 9 sont autorisés dans la combinaison, et il n'y a aucun nombre en double dans chaque combinaison.

Limiter le nombre d'éléments dans le plan sélectionné

class Solution {
    public $res = [];
    /** * @param Integer $k * @param Integer $n * @return Integer[][] */
    function combinationSum3($k, $n) {
        $this->dfs([], [1,2,3,4,5,6,7,8,9], $n, 0, $k);
        return $this->res;
    }
    function dfs($array, $candidates, $n, $start, $k) {
        if ($n < 0) return;
        if ($n === 0 && count($array) === $k) {
            $this->res[] = $array;
            return;
        }
        for ($i = $start; $i < 9; $i++) {
            if ($i !== $start && $candidates[$i] === $candidates[$i - 1]) continue;
            $array[] = $candidates[$i];
            $this->dfs($array, $candidates, $n - $candidates[$i], $i + 1, $k);
            array_pop($array);
        }
    }}
Copier après la connexion

Apprentissage recommandé : tutoriel vidéo php

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!

Étiquettes associées:
php
source:hxd.life
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal