HJ93 数组分组

知识点字符串递归

描述

对于给定的 n 个整数 a1,a2,...,an,将其分为 a,b 两个数组,满足:

∙ ∙所有 5 的倍数元素均在 a 数组中;

∙ ∙所有 3 的倍数元素(不包括 5 的倍数)均在 b 数组中;

∙ ∙其他元素可以任意分配。

求解是否存在一种分配方案,使得 a 数组中各个元素之和等于 b 数组中各个元素之和。每一个元素要么在 a 数组中,要么在 b 数组中;数组可以为空,此时和为 0。如果存在这样的方案,输出 true,否则输出 false。

输入描述:

第一行输入一个整数 n(1≦n≦30)代表给定的整数个数。

第二行输入 n 个整数 a1,a2,...,an(−500≦ai≦500)。

保证数据随机生成。

输出描述:

如果存在满足条件的分配方案,输出 true,否则输出false。

示例1

输入:

复制代码
4
1 5 -5 1

输出:

复制代码
true

说明:

复制代码
在这个样例中,a 数组可以为 {5,−5,1},b 数组可以为 {1},满足条件。

示例2

输入:

复制代码
3
3 5 8

输出:

复制代码
false
cpp 复制代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_set>
using namespace std;

int main(){
    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); //剩余的加入数组并求和
                rest += x;
            }
        }
        unordered_set<int> s1, s2;
        s1.insert(0); //枚举所有组合的不重复和,0为空数组
        for(int i = 0; i < arr.size(); i++){ //遍历每一个数字
            s2 = s1; //每个数字都要与当前集合的每个数相加组成新的和
            for(auto it: s2)
                s1.insert(it + arr[i]);
        }
        bool flag = false;
        for(auto it: s1){ //遍历枚举的集合
            if(it + sum5 == sum3 + rest - it){ //分成两部分后相等
                flag = true;
                break;
            }
        }
        cout << (flag ? "true" : "false") << endl;
    }
    return 0;
}
相关推荐
Nil2082 小时前
leetcode 198打家劫舍
算法·leetcode·职场和发展
Shaoshing2 小时前
前缀和与差分
java·数据结构·算法·前缀和·差分
loulanyue_3 小时前
构建房产认知决策智能:Harness底座与AI自进化的技术实践——读贝壳首席算法科学家尹俊希2026云栖专场演讲
人工智能·算法
碧海银沙音频科技研究院3 小时前
基于炬芯ATS录音卡BLE控制协议
人工智能·嵌入式硬件·算法·语音识别
jimy14 小时前
C++ 虚函数表:基类和派生类共用一张 vtable 吗?
开发语言·c++
爱吃提升4 小时前
Dev-C++ 5.11 C++断点调试完整教程
开发语言·c++
suhan4 小时前
【数据结构】三、栈和队列:6.链队列、双端队列、队列的应用(树的层次遍历、广度优先BFS、先来先服务FCFS)
数据结构·后端·算法
姜鱼问生4 小时前
Docker Volume 备份与恢复实战:不停机迁移数据
后端·算法·架构
suhan4 小时前
【数据结构】三、栈和队列:5.顺序队列(循环队列)(初始化,判空判满,入队,出队,实例)
数据结构·后端·算法
suhan4 小时前
【数据结构】三、栈和队列:3.链栈(链栈栈的初始化,判空,进栈,出栈,读取栈顶,链栈实例)
数据结构·后端·算法