如果vector a
中给定元素的总和除以2
是整数,则我的代码运行良好,但如果是双精度,则会失败。所以我需要检查和是否是双的,是否返回false
。我试着做了,但没用。TestCase a= [1,2,3,5]
在此失败
bool isPresent(vector<int>& a, vector<int>& v, const double& sum, int i) {
int n = a.size();
if(i == n) return false;
if(int(sum) != (sum)) return false; // i tried like this but not working
if(accumulate(v.begin(), v.end(), 0) == sum) return true;
if(a[i] <= sum) {
v.push_back(a[i]);
for(auto i=v.begin();i!=v.end();i++)
cout << *i <<" ";
cout << 'n';
if(isPresent(a, v, sum, i+1))
return true;
v.pop_back();
}
if(isPresent(a, v, sum, i+1))
return true;
return false;
}
bool canPartition(vector<int>& a) {
vector<int> v;
int n = a.size();
int s=0;
for(int i=0;i<n;i++) {
s += a[i];
}
double sum = (double)(s/2);
if((int)sum != sum) return false; // also here
return isPresent(a, v, sum, 0);
}
int sum = (double)(s/2);
这取s
并将其(作为整数(除以2
(截断(,然后将确定的整数结果强制转换为double
,然后将结果存储回int
,CCD_8再次截断。考虑
double sum = ((double)s) / 2.0;
但是你可以通过检查模来避免通过double
,这告诉你除法下的余数。
if (s % 2 != 0) return false;
int sum = (double)(s/2);
if((int)sum != sum) return false; // also here
就像其他答案提到的一样,这是一个糟糕的演员阵容(应该是s/2.
(。然而,实际上你根本不需要这么做。检查是否可以平均除以二的更好方法是检查除法的余数:
if(s % 2 != 0) { return false; }
Mod(%
(将两个数字相除,得到余数。因此,如果mod(或余数(不为0,那么我们就不能平分。
还要注意
if(isPresent(a, v, sum, i+1))
return true;
return false;
可以只是
return isPresent(a, v, sum, i+1);
除了OP注意到的bug之外
。。。潜在错误:当CCD_ 13不在CCD_。
const double& sum
...
if(int(sum) != (sum)) return false; // Problem code
相反,使用modf()
返回小数部分。
#include <cmath>
double whole;
double fraction = modf(sum, &whole);
if (fraction != 0.0) return false;