【问题标题】:Boolean Recursion with multiples of 5 included包含 5 的倍数的布尔递归
【发布时间】:2021-06-25 14:28:54
【问题描述】:

这是我正在解决的问题: “给定一个整数数组,是否可以选择一组整数,使得该组与这些附加约束的给定目标相加:数组中所有 5 的倍数必须包含在组中。如果紧跟在 5 的倍数之后的值是 1,不能选择它。(不需要循环。)"

我尝试了以下方法:

public boolean groupSum5(int start, int[] nums, int target) {
  if (start == nums.length) return (target == 0);
  if (groupSum5(start + 1, nums, target - nums[start]) && nums[start] % 5 == 0)
    return true;
  if (groupSum5(start + 1, nums, target)) return true;
  return false;
}

但它只能得到 5 的倍数,我试过这个:

public boolean groupSum5(int start, int[] nums, int target) {
  if (start == nums.length) return (target == 0);
  if (groupSum5(start + 1, nums, target - nums[start]) && nums[start] % 5 == 0)
    return true;
  if (groupSum(start + 1, nums, target - nums[start])) return true;
  if (groupSum5(start + 1, nums, target)) return true;
  return false;
}

但它不起作用,因为有时不包括 5 的倍数。

我知道我的代码还没有满足第二个约束。

有什么想法吗?

编辑:

【问题讨论】:

  • 你能贴出样本输入预期输出吗
  • @deadshot 我发布了它。在问题编号中。

标签: java recursion boolean


【解决方案1】:

if (groupSum5(start + 1, nums, target - nums[start]))

对于输入中的每个数字,您需要选择是否包含它。这个if 是“包含它”选项:这就是您将目标减少值的原因。

&& nums[start] % 5 == 0

...所以这意味着:不可能包含任何给定值,除非它是 5 的倍数。这不是问题描述要您做的!

问题描述要您做的是:如果您所在的数字是 5 的倍数,则必须包含它。您不能选择不包含它。

因此,您将约束限制在错误的 if 和错误的方式上。您真正想要的是第二个 if,它涵盖了要修改的“让不要选择这个数字”:

if (!num[start] % 5 == 0 && groupSum5(start, nums, target)) return true;

换句话说:如果我们所在的数字不是 5 的倍数,那么尝试不包括这个数字,看看是否可行。 (因为当它是 5 的倍数时试图不包含它是无效的)。

如果紧跟在5的倍数后面的值为1,则不能选择。

这是另一个约束,这个约束必须应用于第一个 if(表示“让包括这个数字”的那个)。如果需要一些额外的&& 来过滤 -OUT- 你所在的数字是 1 的情况,AND 它不是序列中的第一个数字,AND 序列中的前一个数字是 5 的倍数:在这种情况下,“包括数字”不是有效的移动。

使用反转条件(前面带有!)和&&,类似于上面的示例。您想要完成的是,如果由于附加约束而导致该步骤无效,则简单地跳过“尝试包含此数字,然后看看我们是否可以通过将此算法应用于列表的其余部分来解决它”的步骤.

【讨论】:

  • public boolean groupSum5(int start, int[] nums, int target) { if (start >= nums.length) return (target == 0); if (!(nums[start] == 1) && !(start == 0) && !(nums[start - 1] % 5 == 0) && groupSum5(start + 1, nums, target - nums[start])) return true; if (nums[start] % 5 != 0 && groupSum5(start + 1, nums, target)) return true; return false; } 感谢您的回答。我按照你的解释试过了:但它没有按计划工作。我是不是做错了什么?
  • “如果”从不包含第一个数字。
  • public boolean groupSum5(int start, int[] nums, int target) { if (start == nums.length) return (target == 0); if (start != 0 && nums[start] == 1 && nums[start - 1] % 5 == 0) { if (groupSum5(start + 1, nums, target)) return true; } else { if (groupSum5(start + 1, nums, target - nums[start])) return true; } if (nums[start] % 5 != 0 && groupSum5(start + 1, nums, target)) return true; return false; } 我是这样做的,它奏效了。感谢您的帮助。
猜你喜欢
  • 2022-12-04
  • 2018-09-25
  • 2018-06-27
  • 2011-12-12
  • 2022-11-12
  • 2014-03-02
  • 2019-12-16
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多