【发布时间】:2020-08-19 11:09:42
【问题描述】:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
bool check(int a[], int n, int s)
{
bool dp[n+1][s+1];
for(int i=0;i<n+1;i++)
{
for(int j=0;j<s+1;j++)
{
if(i==0)
dp[i][j] = false;
if(j==0)
dp[i][j] = true;
if(a[i-1]<=j)
dp[i][j] = dp[i-1][j-a[i-1]] || dp[i-1][j];
else
dp[i][j] = dp[i-1][j];
}
}
return dp[n][s];
}
int main()
{
//code
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int arr[n];
int s=0;
for(int i=0;i<n;i++){
cin>>arr[i];
s+=arr[i];
}
if(s%2==0)
{
s/=2;
if(check(arr,n,s))
cout<<"YES\n";
else
cout<<"NO\n";
}
else
cout<<"NO\n";
}
return 0;
}
问题是 给定一组数字,检查它是否可以分成两个子集,使得两个子集中的元素之和相同。
对于测试用例; 4 1 5 11 5 输出将是 YES 因为 存在两个子集,例如 {1, 5, 5} 和 {11}。
上述测试用例通过但显示错误答案 8 479 758 315 472 730 101 460 619 实际答案应该是 YES,但它显示 NO。
【问题讨论】:
-
#include<bits/stdc++.h>-- no, please。using namespace std;——no, please。#define ll long long-- 不,请。 (您实际上并没有使用 定义在首位,它使您的代码less 可读,而不是更多。)int arr[n];-- no, please。 -
通用调试建议,检查你的假设,检查你的中间值。添加一些调试输出并找出您的结果从哪里开始偏离您的假设。看来您还没有做任何事情,因为您将代码呈现为一个整体并希望我们对其进行调试。
-
尝试使用调试器。或者至少在你的代码中添加一些 cmets。
-
前两个
if看起来不对。分配给dp[i][j]的任何内容都将被后面的if - else覆盖。只能加入以前的评论者,使用调试器很容易发现此类错误 -
谢谢大家。现在问题已经解决了。
标签: c++ dynamic-programming subset-sum