c++ - 为什么我的 3-Partitioning 问题无法通过给定的测试用例?(3-分区问题)
问题描述
参考以下内容: 3-PARTITION 问题
有人可以解释为什么在 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。
有人可以解释一下这个缺陷吗?我不明白,为什么它在错误时会通过法官?
编辑-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)。请解释我的解决方案中的错误。
解决方案
假设 R. Gurung 的函数是正确的。dp和A之间存在依赖关系,因此您不能按照您的建议从头到尾填充它。
推荐阅读
- javascript - 如何获取我已经上传的文件,我想删除它并使用引导文件输入替换它
- python - 使用 selenium:如何在使用 python 关闭驱动程序后保持登录状态
- json - 连接嵌套字段
- plsql - 从分号分隔的字符串中获取不同的电子邮件
- java - 将拥有自己数据库的我的模块集成到另一个应用程序中
- java - 从命令行设置弹簧属性文件位置
- c++ - 为什么这不会为链接器生成重复的符号?
- fortran - 是否有可以检查变量值的 Fortran IDE?
- agda - Agda 中集合和函数类别的简单编码
- java - 如何以编程方式设置内容类型?获取 org.jvnet.mimepull.MIMEParsingException:缺少开始边界