L'épée fait référence à l'offre102 : la valeur cible de l'addition et de la soustraction

Question :
étant donné un tableau d'entiers positifs nums et une cible d'entiers.
Une expression peut être construite en ajoutant un '+' ou un '-' à chaque entier du tableau, puis en concaténant tous les entiers :
par exemple, nums = [2, 1], vous pouvez ajouter un '+' avant 2, et ajoutez '+' avant 1 Ajoutez '-' avant puis concaténez pour obtenir l'expression "+2-1".
Renvoie le nombre d'expressions distinctes qui peuvent être construites par les méthodes ci-dessus qui évaluent la cible.
Exemple 1 :
Entrée : nums = [1,1,1,1,1], cible = 3
Sortie : 5
Explication : Il existe 5 façons de faire en sorte que la cible finale soit égale à 3.
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3
Exemple 2 :
Entrée : nums = [1], cible = 1
Sortie : 1
Analyse :
Transformez le problème :Avant d'analyser et de résoudre ce problème, nous devons effectuer des opérations mathématiques, en ajoutant "+" à certains nombres du tableau d'entrée et "-" à certains nombres. Si la somme de tous les nombres ajoutés avec "+" est p, et la somme de tous les nombres ajoutés avec "-" est q, selon les exigences du titre pq=cible, si tous les nombres dans les nombres sont accumulés, la somme de les nombres dans l'ensemble du tableau peuvent être obtenus, il est compté comme somme, c'est-à-dire p + q = somme. Ajoutez ces deux équations pour obtenir la formule 2p=target+sum=》p=(target+sum)/2, l'équation ci-dessus montre que si vous pouvez trouver le nombre dans le tableau qui totalise (target+sum)/2 , et ajoutez-leur "+", puis ajoutez "-" aux autres nombres, et le résultat final du calcul est la cible. Ce problème équivaut donc à compter le nombre de façons de sélectionner des nombres dans un tableau dont la somme est (cible + somme) / 2, un problème typique de sac à dos 0-1.
L'idée de cette question est à peu près la même que celle de 101.
Code:

public class FindTargetSumWays {
    
    
    public static void main(String[] args) {
    
    
        FindTargetSumWays findTargetSumWays = new FindTargetSumWays();
        int[] nums = {
    
    1,1,1,1,1};
        int targetSumWays = findTargetSumWays.findTargetSumWays(nums, 3);
        System.out.println(targetSumWays);
    }
    public int findTargetSumWays(int[] nums, int target) {
    
    
        int sum = 0;
        for (int num : nums) {
    
    
            sum += num;
        }
        if ((sum+target)%2 == 1|| sum<target){
    
    
            return 0;
        }
        return subsetSum(nums,(sum+target)/2);
    }

    private int subsetSum(int[] nums, int target) {
    
    
        int[] dp = new int[target+1];
        dp[0] = 1;
        //如果当前值大于目标值,方法数一定为0
        for (int num:nums){
    
    
            for (int j = target; j >=num ; j--) {
    
    
                dp[j] +=dp[j-num];
            }
        }
        return dp[target];
    }
}

insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/Jiaodaqiaobiluo/article/details/123284860
conseillé
Classement