int combinationSum4(vector<int>& nums, int target) { vector<int> dp(target + 1, 0); dp[0] = 1; for (int i = 0; i <= target; i++) { for (int j = 0; j < nums.size(); j++) { if (i < nums[j]) continue; dp[i] = (dp[i] >= INT_MAX - dp[i - nums[j]]) ? INT_MAX : dp[i] + dp[i - nums[j]]; } } return dp[target]; } 作者:ikaruga 链接:https://leetcode-cn.com/problems/combination-sum-iv/solution/377-by-ikaruga/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如你所见这个代码不是我写的,我只是想说明一下本题的坑。
我们的朴素思想是做一个 dp,然而你会发现这道题如果你不用 python,测试用例的结果大小直接起飞。举个例子,
[3,33,333] 999
这个测试用例的最终结果是多少?
1127975497240371557486457
更不要说真实的测试用例不是 999,而是 10000。
因此 AC 本题需要注意一下几点:
第一、不要用 dp + dfs,而应该直接填完整个 dp 数组。否则 TLE。
第二、如果某个 dp 槽位的结果可能会大于 INT_MAX,就直接将其设为 INT_MAX。因为题目限制了返回类型为 int,因此一定不会存在结果大于 INT_MAX 的测试用例。
附上我的 python 代码:
class Solution: def combinationSum4(self, nums: List[int], target: int) -> int: m = [0]*(target + 1) m[0] = 1 for i in range(1, target + 1): for n in nums: if i - n >= 0: m[i] += m[i - n] return m[target]