数组分组(C++牛客网)

209 篇文章 2 订阅

解题思路:

(1)递归

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

bool tag=false;
void judge(vector<int> &v,int start,int target3,int target5) {
    if(target3==0 && target5==0) tag=true;
    else if(start<v.size()) {
        judge(v,start+1,target3-v[start],target5);
        judge(v,start+1,target3,target5-v[start]);
    }
}

bool help(vector<int> &v) {
    vector<int> v1;
    int sum3=0,sum5=0,sum=0;
    for(int i=0;i<v.size();i++) {
        if(v[i]%3==0 && v[i]%5!=0) sum3+=v[i];
        else if(v[i]%3!=0 && v[i]%5==0) sum5+=v[i];
        else {
            v1.push_back(v[i]);
            sum+=v[i];
        }
    }
    sum+=sum3;
    sum+=sum5;
    if(sum/2*2!=sum) return false;
    judge(v1,0,sum/2-sum3,sum/2-sum5);
    if(tag==true) return true;
    else return false;
}
int main() {
    int n,a;
    while(cin>>n) {
        tag=false;
        vector<int> v;
        for(int i=0;i<n;i++) {
            cin>>a;
            v.push_back(a);
        }
        if(help(v)) cout<<"true"<<endl;
        else cout<<"false"<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值