您的位置:首页 > 编程语言 > Java开发

华为oj 201301 JAVA题目0-1级

2016-03-07 10:57 363 查看


有人说用“背包问题”可以解决(没有验证),因为对于动态规划还是有些许抗拒,所以还是用别的方法解决!

思路如下:

1.把数据分成三类,第一类,能

被5整除的(包括既能被5整除又能被3整除的);第二类,能被3整除的;第三类,其它数字。

2.分别算出前两类的数字和,sumj,sumk

3.将第三类数字进行划分组合(我程序实现的有bug,但是能通过oj,在划分组合时我只用了一次循环,这是远远不够的,正确的算法待日后更新吧!)

4.oj给的测试用例输出的应该都是true;

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
int n, temp, a[100], b[100], c[100];
int j, k, l, max = 0;
int sumj, sumk, suml, tempsum;

//初始化
memset(a, 0, sizeof(int)* 100);
memset(b, 0, sizeof(int)* 100);
memset(c, 0, sizeof(int)* 100);
j = k = l = 0;
sumj = sumk = suml = 0;

// 获取输入数据
cin >> n;
if (n < 2)
{
cout << "false" << endl;
return 0;
}
for (int i = 0; i < n; i++)
{
cin >> temp;
if (abs(temp) % 5 == 0)
{
a[j] = temp;
j++;
}
else if (abs(temp) % 3 == 0)
{
b[k] = temp;
k++;
}
else
{
c[l] = temp;
l++;
}
}

for (int i = 0; i < n; i++)
{
sumj += a[i];
sumk += b[i];
suml += c[i];
}

int i;
tempsum = 0;
for (i = 0; i < l; i++)
{
if (abs(sumj - sumk) == abs(suml - tempsum - tempsum))//将suml分成两部分tempsum 和 suml - tempsum,这两部分的差值和(sumj和sumk的差值)相同
{
break;
}
tempsum += c[i];
}
if (i < l)
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: