Combination Sum IV中两种JAVA动态规划解法的不同
2017-04-08 15:06
232 查看
leetcode题目:https://leetcode.com/problems/combination-sum-iv/#/description
Given an integer array with all positive numbers and no duplicates,
find the number of possible combinations that add up to a positive
integer target.
Example:
nums = [1, 2, 3] target = 4
The possible combination ways are: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1)
(1, 3) (2, 1, 1) (2, 2) (3, 1)
Note that different sequences are counted as different combinations.
solution 1 : (correct one)
solution 2:(wrong one )
when give a testcase:
nums = [1, 2, 3]
target = 4
solution 1 got the answer 7:
The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
i wanna say this is Permutations not combination.
solution 2 give the answer 4, Obviously, delete the same combination from the above possible Permutations, eg (1, 1, 2) (1, 2, 1) (2, 1, 1) (1, 3) (3, 1), the answer is 4.
so, solution 1 could get the Permutation Sum, and solution 2 could get the Combination Sum. this is because the count order of dp and nums is different.
Given an integer array with all positive numbers and no duplicates,
find the number of possible combinations that add up to a positive
integer target.
Example:
nums = [1, 2, 3] target = 4
The possible combination ways are: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1)
(1, 3) (2, 1, 1) (2, 2) (3, 1)
Note that different sequences are counted as different combinations.
solution 1 : (correct one)
public class Solution { public int combinationSum4(int[] nums, int target) { // 在递归过程中,如果状态集是有限的,我们可以采用动态规划的方法,把每个状态的结果记录下来,以减少计算量。 int[] dp = new int[target + 1]; dp[0] = 1; for (int i = 1; i < dp.length; i++) { // outer loop is to traversal dp array for (int j = 0; j < nums.length; j++) { // inner loop is to traversal nums array if (i - nums[j] >= 0) { dp[i] += dp[i - nums[j]]; } } } return dp[target]; } }
solution 2:(wrong one )
public class Solution { public int combinationSum4(int[] nums, int target) { int [] dp = new int[target + 1]; dp[0] = 1; for (int i = 0; i < nums.length; i++) { // outer loop is to traversal nums array and nums array should be ASC ordered for (int j = nums[i]; j <= target; j++) { // inner loop is to traversal dp array dp[j] += dp[j - nums[i]]; } } return dp[target]; } }
when give a testcase:
nums = [1, 2, 3]
target = 4
solution 1 got the answer 7:
The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
i wanna say this is Permutations not combination.
solution 2 give the answer 4, Obviously, delete the same combination from the above possible Permutations, eg (1, 1, 2) (1, 2, 1) (2, 1, 1) (1, 3) (3, 1), the answer is 4.
so, solution 1 could get the Permutation Sum, and solution 2 could get the Combination Sum. this is because the count order of dp and nums is different.
相关文章推荐
- java实现最大字段和的动态规划解法
- 促销中“满X优惠”问题的两种解法:动态规划和枚举法
- Combination Sum IV问题及解法
- Leetcode第303 Range Sum Query - Immutable(简单动态规划解法)
- 24点游戏动态规划解法(java)
- 求最大连续子序列的和,两种解法:动态规划 & Kadane算法
- 如何用两种不同的方法动态绘制饼状图
- 动态规划小结 - 二维动态规划 - 时间复杂度 O(n*n)的棋盘型,题 [LeetCode] Minimum Path Sum,Unique Paths II,Edit Distance
- 背包算法递归实现,递归转动态规划的一般方法java实现
- Maximum Subsequence Sum【PAT 1007题】---简单的动态规划
- java 动态代理两种实现方式
- 算法学习之路:动态规划-钢条切割-java实现
- 0-1背包问题的动态规划解法为什么是NPC问题?
- 动态规划解决矩阵链乘问题的java编码实现
- java中两种不同的 string赋值比较
- 增强学习(三)----- MDP的动态规划解法
- Java反射 根据不同方法名动态调用不同的方法
- leetcode 198House Robber(简单动态规划解法)
- LeetCode : Combination Sum II [java]