【问题标题】:Why does my 3-Partitioning problem fail the given test case? (3-Partitioning problem)为什么我的 3-Partitioning 问题无法通过给定的测试用例? (3-分区问题)
【发布时间】:2020-08-20 00:04:45
【问题描述】:

参考以下内容: 3-PARTITION problem

有人能解释一下为什么在 R. Gurung 的 cpp 解决方案中,我们从 sum 开始我们的 j 和 k 循环吗?如果我们从 0 开始循环呢?

我将给定的解决方案修改如下:

#include <vector>
#include <bits/stdc++.h>
using namespace std;


int partition3(vector<int> &A)
{
  int sum = accumulate(A.begin(), A.end(), 0);
  if (sum % 3 != 0)
  {
    return false;
  }
  int size = A.size();

  vector<vector<int>> dp(sum + 1, vector<int>(sum + 1, 0));
  //bool dp[sum+1][sum+1];
  dp[0][0] = true;

  // process the numbers one by one
  for (int i = 0; i < size; i++)
  {
    for (int j = 0; j <=2*(sum/3); j++)
    {
      for (int k = 0; k <=2*(sum/3); k++)
      {
        if (dp[j][k])
        {
          dp[j + A[i]][k] = true;
          dp[j][k + A[i]] = true;
        }
      }
    }
  }

  for(int i=0;i<=sum;i++)
  {
    for(int j=0;j<=sum;j++)
    {
      cout<<dp[i][j]<<" ";
    }
    cout<<'\n';
  }

  return dp[sum / 3][sum / 3];
}

int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  vector<int> a;

  int n;
  cin>>n;

  for(int i=0;i<n;i++)
  {
    int input;
    cin>>input;
    a.push_back(input);
  }


  cout<<partition3(a);
}

我在 partition3() 中的循环几乎适用于所有解决方案,它甚至通过了法官的测试用例,并且看起来是正确的,除非我给出了一个特定的测试用例:

10
20 9 13 27 25 7 2 9 17 15

对于给定的测试用例,答案应该是 0 这应该期望程序输出 0。因为每个人都应该得到 48,如果有人拿了 27,那么他无论如何选择都不能得到 48。

但我以前的算法,即通过程序的算法,输出 1。

有人可以解释一下这个缺陷吗?我不明白,为什么它在错误时会通过法官?

EDIT-1

  for (int i = 0; i < size; i++)
  {
    for (int j = sum; j >=0; --j)
    {
      for (int k = sum; k >=0; --k)
      {
        if (dp[j][k])
        {
          dp[j + A[i]][k] = true;
          dp[j][k + A[i]] = true;
        }
      }
    }
  }

上述循环输出给定测试用例的正确答案 (0)。请解释我的解决方案中的错误。

【问题讨论】:

    标签: c++ algorithm dynamic-programming partitioning array-algorithms


    【解决方案1】:

    假设 R. Gurung 的函数是正确的。 dpA 之间存在依赖关系,因此您无法按照您的建议从头到尾填充它。

    【讨论】:

    • 我也这么认为,但我在编辑部分提供的循环工作正常并输出正确答案。事实上,当我输出完整的生成向量 dp[][] 时,两者之间存在很多差异(我修改后的解决方案和 EDIT-1)。你能解释一下为什么吗?
    • 看起来你没有填充所有元素试试 for (int j = 0; j 而不是 for (int j = 0; j
    • 我不能这样做,因为 dp[j + A[i]][k] = true; dp[j][k + A[i]] = true; 如果 j+A[i] 或 k+ A[i] 大于总和,则会出错。跨度>
    • 您不能使用您的解决方案,因为 A 的第一项被 dp 的最后一项填充
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多