华为oj 201301 JAVA题目0-1级

来源:互联网 发布:信仰 知乎 编辑:程序博客网 时间:2024/05/16 03:26

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

思路如下:

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;}


0 0