LeetCode 377. 组合总和 Ⅳ--完全背包

  1. 组合总和 Ⅳ

给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。

题目数据保证答案符合 32 位整数范围。

示例 1:

输入:nums = [1,2,3], target = 4
输出:7
解释:
所有可能的组合为:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
请注意,顺序不同的序列被视作不同的组合。

示例 2:

输入:nums = [9], target = 3
输出:0

提示:

1 <= nums.length <= 200
1 <= nums[i] <= 1000
nums 中的所有元素 互不相同
1 <= target <= 1000

进阶:如果给定的数组中含有负数会发生什么?问题会产生何种变化?如果允许负数出现,需要向题目中添加哪些限制条件?

题解

就是很裸的完全背包问题。

唯一坑的是,中间运算过程会爆long long,但是题目说了最后的答案是不会超过int范围,所以针对超过int的直接不管就行。

AC代码

class Solution {
public:
    typedef long long ll;
    ll dp[1100],ans[1100];
    int combinationSum4(vector<int>& nums, int target) 
    {
        memset(dp,0,sizeof(dp));
        memset(ans,0,sizeof(ans));
        ans[0]=1;
        for(int j=0;j<=target;j++)
        {
            for(int i=0;i<nums.size();i++)
            {
                if(j>=nums[i])
                {
                    if(ans[j]>1e10)continue;
                    if(dp[j]<dp[j-nums[i]]+nums[i])
                    {
                        dp[j]=dp[j-nums[i]]+nums[i];
                        ans[j]=ans[j-nums[i]];
                    }
                    else if(dp[j]==dp[j-nums[i]]+nums[i])
                    {
                        ans[j]+=ans[j-nums[i]];
                    }
                }
            }
            //cout<
        }
        //cout<
        if(dp[target]==target)return ans[target];
        return 0;
    }
};

LeetCode 377. 组合总和 Ⅳ--完全背包_第1张图片

你可能感兴趣的:(LeetCode,动态规划,leetcode,动态规划,算法)