题解 | #数组分组#

数组分组

https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86

****************************************

注意这两题的区别

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
bool judge(int i, vector<int>& arr, int sum1, int sum2);
int main() {
    /*
        我们将5的倍数的数累加(记为第一组),3的倍数的数累加(记为第二组),剩余的数加入数组中。然后我们可以递归处理剩余的数。
        对于剩余的数,每次我们可以选择将其加入第一组或者是第二组,加入第一组我们可以记为加,加入第二组我们可以记为减,直到递归到最后我们对数组剩余中这些数的累加减和等于最初5的倍数和3的倍数的和他们的差的绝对值,说明剩余的数是可以填补这个空缺的。

    */

    int n;
    while (cin >> n) {
        vector<int>arr;
        int sum3 = 0;
        int sum5 = 0;
        int rest = 0;
        for (int i = 0; i < n; i++) {
            int x;
            cin >> x;
            if (x % 5 == 0) sum5 += x;
            else if (x % 3 == 0) sum3 += x;
            else arr.push_back(x);
        }
        if (judge(0, arr, 0, abs(sum5 - sum3)))
            cout << "true" << endl;
        else
            cout << "false" << endl;
    }
}
bool judge(int i, vector<int>& arr, int sum1, int sum2) {
    if (i == arr.size())
        return abs(sum1) == sum2;
    else //加放一边,减放另一边,i+1是下一轮操作的下标
        //这样就处理了dp难处理负数的情况
        //把一个正数放在sum3和把他的相反数放进sum5对于最后求差的帮助是一样的
        return judge(i + 1, arr, sum1 + arr[i], sum2) ||
               judge(i + 1, arr, sum1 - arr[i], sum2);
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

程序员鼠鼠_春招版:都很烂大街,rpc也基本没人问,考研吧,不然就包装一段实习再去
点赞 评论 收藏
分享
MingoTree:看不出你你的技术栈,想找什么工作,然后课设项目别写上去了,自我评价删了,前后端你想好你要干啥,这种简历投上去秒挂的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务