칼은 offer102: 덧셈과 뺄셈의 목표 값을 나타냅니다.

질문:
양의 정수 num과 정수 대상의 배열이 주어졌습니다.
표현식은 배열의 각 정수에 '+' 또는 '-'를 추가한 다음 모든 정수를 연결하여 구성
할 수 있습니다. 예를 들어 nums = [2, 1], 2 앞에 '+'를 추가할 수 있으며, 1 앞에 '+'를 추가하고 '-'를 추가한 다음 연결하여 "+2-1"이라는 표현을 얻습니다.
대상으로 평가되는 위의 메서드로 구성할 수 있는 고유한 표현식의 수를 반환합니다.
예 1:
입력: nums = [1,1,1,1,1], target = 3
출력: 5
설명: 최종 목표 합계를 3으로 만드는 5가지 방법이 있습니다.
-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
예제 2:
입력: nums = [1], target = 1
출력: 1
분석:
문제 변환:이 문제를 분석하고 해결하기 전에 입력 배열의 일부 숫자에 "+"를 추가하고 일부 숫자에 "-"를 추가하여 수학 연산을 수행해야 합니다. "+"가 추가된 모든 숫자의 합이 p이고 "-"가 추가된 모든 숫자의 합이 q이면 제목 요구 사항 pq=target에 따라 숫자의 모든 숫자가 누적되면 전체 배열의 숫자를 얻을 수 있으며 합계로 계산됩니다. 즉, p+q=sum입니다. 이 두 방정식을 추가하여 공식 2p=target+sum=》p=(target+sum)/2를 얻으면 위 방정식은 배열에서 합이 (target+sum)/2 인 숫자를 찾을 수 있음을 보여줍니다. 거기에 "+"를 더하고 다른 숫자에 "-"를 더하면 최종 계산 결과가 목표가 됩니다. 따라서 이 문제는 합이 (target+sum)/2인 배열에서 숫자를 선택하는 방법의 수를 세는 것과 동일하며 일반적인 0-1 배낭 문제입니다.
이 질문의 아이디어는 101의 아이디어와 거의 같습니다.
암호:

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];
    }
}

여기에 이미지 설명 삽입

추천

출처blog.csdn.net/Jiaodaqiaobiluo/article/details/123284860