分组问题 c++ 递归

题目描述
编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true;不满足时返回false。

输入
第一行是数据个数,第二行是输入的数据
输出
返回true或者false

输入范例
4
1 5 -5 1
输出范例
true

思路
本题初步理解为两组互相影响的递归,可以通过他们之间的联系将其转换为一组递归。
需要两组数和相等,可以理解为差为0.
往两组数中添加元素就是在他们之间的绝对值上增减。如果数值添加完毕后两组数距离为0,即可判定存在分组满足条件。

牛客网上还有dfs的方法,以后再讨论。

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;

int sum5;
int sum3;
int dis0;
vector<int> List;
//假设第index-1个数已经分好,分第index个数
bool f(int index,int dis){
    if(index==List.size()){
        return abs(dis)==dis0;
    }
    return (f(index+1,dis+List[index])||f(index+1,dis-List[index]));
}
int main()
{
    int n;
    while(cin>>n){
        int t=n;
        sum3=sum5=0;
        List.clear();
        while(t--){
            int a;
            cin>>a;
            if(a%5==0){
                sum5+=a;
            }else if(a%3==0){
                sum3+=a;
            }else{
                List.push_back(a);
            }
        }
        dis0=abs(sum5-sum3);
        if(f(0,0)){
            cout<<"true"<<endl;
        }else{
            cout<<"false"<<endl;
        }
    }
    return 0;
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_43843055

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值