【发布时间】: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