- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我对组合和的动态规划解决方案有点困惑,给你一个数字列表和一个目标总和,你想计算你可以通过多少种方式求和到这个目标总和。数字可以重复使用多次。我对内循环和外循环是否可以互换感到困惑。有人可以解释以下两者之间的区别,在什么情况下我们会使用一个而不使用另一个,或者它们是相同的。
int [] counts = new int[total];
counts[0] = 1;
// (1)
for(int i = 0; i <= total; i++) {
for(int j = 0; j < nums.length; j++) {
if(i >= nums[j])
counts[i] += counts[i - nums[j]];
}
}
// (2)
for(int j = 0; j < nums.length; j++)
for(int i = nums[j]; i <= total; i++) {
counts[i] += counts[i - nums[j]];
}
}
最佳答案
这两个版本确实不同,产生不同的结果。
我将在下面的所有示例中使用 nums = {2, 3}
。
版本 1 从 nums
中查找元素的排序 组合数,其总和为 total
。它通过遍历所有“小计”并计算有多少组合具有正确的总和来实现这一点,但它不会跟踪元素。例如,5 的计数将为 2。这是使用第一个元素(值为 2)并在 nums[3]
中找到 1 个组合以及第二个元素的另一个组合(值为3) 与 nums[2]
中的 1 组合。您应该注意,这两种组合都使用单个 2 和单个 3,但它们代表 2 个不同的有序列表 [2, 3]
& [3, 2]
。
另一方面,版本 2 从 nums
中查找元素的无序 组合数,其总和为 total
。它通过计算有多少组合具有正确的总和(每个小计)来做到这一点,但与版本 1 相反,它在移动到下一个元素之前完全“使用”每个元素,从而避免同一组的不同排序。当使用第一个元素 (2) 计算小计时,所有计数最初都将为 0(除了 0 总和标记),任何偶数小计都将获得新计数 1。当使用下一个元素时,就好像它在后面所有 2 都已经在组中,因此,与版本 1 相反,只有 [2, 3]
被计算在内,而不是 [3, 2]
。
顺便说一下,nums
中元素的顺序不会影响结果,正如解释的逻辑所理解的那样。
关于java - 具有组合和内循环和外循环可互换的动态编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40225304/
在以下python代码中: narg=len(sys.argv) print "@length arg= ", narg if narg == 1: print "@Usage: in
我需要遍历三个列表并处理每个组合。最外层和第二级循环(list1/list2)的顺序取决于一些排序规则。此外,我在最后一个 (list3) foreach 循环之前和之后都有一些逻辑。ProcesPa
这个问题在这里已经有了答案: How do I break out of nested loops in Java? (37 个回答) 关闭6年前. 如果我在循环中有循环,并且一旦满足 if 语句我想
谁能解释一下这个算法的时间复杂度是多少? for (i = 1; i = n + n/2 + n/3 ... n/n但是是 < n + 1 + n/2 + 1 + n/3 + 1 + n/4 + 1.
我将更新从 foreach 循环生成的特定 ID 的值字段。 $sql = "SELECT `user_id`, max(case when `meta_key` = 'link' the
我是一名优秀的程序员,十分优秀!