zoukankan      html  css  js  c++  java
  • 组合总和 IV

    组合总和 IV

    题目:
    给出一个都是正整数的数组 nums,其中没有重复的数。从中找出所有的和为 target 的组合个数。

    样例
    样例1

    输入: nums = [1, 2, 4] 和 target = 4
    输出: 6
    解释:
    可能的所有组合有:
    [1, 1, 1, 1]
    [1, 1, 2]
    [1, 2, 1]
    [2, 1, 1]
    [2, 2]
    [4]
    样例2

    输入: nums = [1, 2] 和 target = 4
    输出: 5
    解释:
    可能的所有组合有:
    [1, 1, 1, 1]
    [1, 1, 2]
    [1, 2, 1]
    [2, 1, 1]
    [2, 2]
    注意事项
    一个数可以在组合中出现多次。
    数的顺序不同则会被认为是不同的组合。

    解题思路:首先思考当和为target时的方案数 = target - nums[0....n - 1]的方案数之和,现在需要求target - nums[0....n - 1]的方案数,发现这是重复子问题

    public class Solution {
        /**
         * @param nums: an integer array and all positive numbers, no duplicates
         * @param target: An integer
         * @return: An integer
         */
        public int backPackVI(int[] nums, int target) {
            int len = nums.length;
            if(len == 0)
                return 0;
            
            //数组定义:dp[i]表示和为i的方案数
            int dp[] = new int[target + 1];
            
            //初始化
            dp[0] = 1;
    
            /**
             * 状态方程:dp[i] = dp[i] + dp[i - nums[j]]
             **/
            for(int i = 1; i <= target; i++) {
                for(int j = 0; j < len; j++) {
                    if(i >= nums[j]) {
                        dp[i] += dp[i - nums[j]];
                    }
                }
            }
            
            return dp[target];
        }
    }
    
  • 相关阅读:
    假期学习总结2-14
    假期学习总结2-13
    假期总结2-12
    假期总结2-11
    读人月神话
    冲刺第五天 11.29 THU
    冲刺第四天 11.28 WED
    冲刺第三天 11.27 TUE
    冲刺第二天 11.26 MON
    冲刺第一天 11.23 FRI
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/14042297.html
Copyright © 2011-2022 走看看