赞
踩
有人说用“背包问题”可以解决(没有验证),因为对于动态规划还是有些许抗拒,所以还是用别的方法解决!
思路如下:
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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。