蓝桥杯数组分割

小蓝有一个长度为 N 的数组 A = [ A0, A1, . . . , A N−1]。现在小蓝想要从 A 对 应的数组下标所构成的集合 I = {0, 1, 2, . . . , N − 1} 中找出一个子集 R1,那么 R1 在 I 中的补集为 R2。记 S 1 = ∑ r∈ R1 A r, S 2 = ∑ r∈ R2 A r,我们要求 S 1 和 S 2 均为 偶数,请问在这种情况下共有多少种不的

R1。当 R1 或 R2 为空集时我们将 S 1 或 S 2 视为 0。 该处使用的url网络请求的数据。

【输入格式】

第一行一个整数 T,表示有 T 组数据。

接下来输入 T 组数据,每组数据包含两行:第一行一个整数 N,表示数组

A 的长度;第二行输入 N 个整数从左至右依次为 A0, A1, . . . , A N−1,相邻元素之

间用空格分隔。

【输出格式】

对于每组数据,输出一行,包含一个整数表示答案,答案可能会很大,你

需要将答案对 1000000007 进行取模后输出

【样例输入】

2

2

6 6

2

1 6

【样例输出】

4

0

对于第一组数据,答案为 4。(注意:大括号内的数字表示元素在数组中的

下标。)

R1 = {0}, R2 = {1};此时 S 1 = A0 = 6 为偶数, S 2 = A1 = 6 为偶数。

R1 = {1}, R2 = {0};此时 S 1 = A1 = 6 为偶数, S 2 = A0 = 6 为偶数。

R1 = {0, 1}, R2 = {};此时 S 1 = A0 + A1 = 12 为偶数, S 2 = 0 为偶数。

R1 = {}, R2 = {0, 1};此时 S 1 = 0 为偶数, S 2 = A0 + A1 = 12 为偶数。

对于第二组数据,无论怎么选择,都不满足条件,所以答案为 0。

【评测用例规模与约定】

对于 20% 的评测用例,1 ≤ N ≤ 10。

对于 40% 的评测用例,1 ≤ N ≤ 100。

对于 100% 的评测用例,1 ≤ T ≤ 10, 1 ≤ N ≤ 1000 , 0 ≤ A i ≤ 1e9。

java 复制代码
import java.util.Scanner;
 
public class Main{
    static int T;//测试数据
    static long ans=0;//结果
    static int[] arr;//数组
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        T=in.nextInt();
        while (T!=0){
            int n=in.nextInt();//数组个数
            arr=new int[n+1];//定义数组容量
            long sum=0;//初始化sum=0
            for (int i = 1; i <=n; i++) {//遍历数组,给数组赋值
                arr[i]=in.nextInt();
                sum+=arr[i];
            }
            if (sum%2==0){//判断总和是否为偶数
                ans++;
            }
            // bfs函数的作用是从数组中的第i个元素开始,寻找一个子集,使得子集中所有元素的和等于sum/2-arr[i],
            // 其中sum为数组中所有元素的和。
            // 在bfs函数中,程序通过递归调用bfs函数来寻找这样的子集。如果找到了这样的子集,则ans加1。
            // 传入了三个参数:i+1,sum和arr[i]。其中i+1表示从i+1号节点开始进行广度优先搜索,
            // sum表示搜索的目标值,arr[i]表示存储图中第i个节点的信息。
            // 简单来说,这段代码是在对从1到n号节点进行广度优先搜索,搜索的目标值为sum。
            for (int i=1;i<=n;i++){
                bfs(i+1,sum,arr[i]);
            }
            // 程序输出ans的值,然后将ans的值重置为0,T的值减1,继续处理下一组数据
            System.out.println(ans);
            ans=0;
            T--;
        }
    }
//这是一个使用深度优先搜索算法(DFS)的代码片段,用于计算一个数组中子集的和是否为偶数,并统计偶数子集的数量。

// 函数bfs()的参数包括next,sum和sum_temp。其中next是下一个要搜索的数组元素的索引,sum是数组的总和,sum_temp是当前子集的和。

// 在函数的开头,我们检查sum_temp是否为偶数,如果是,则检查(sum-sum_temp)是否为偶数。如果两个数都是偶数,则将ans(答案)增加1,并对1000000007取模。

// 然后,我们使用for循环遍历数组中的元素,并递归地调用bfs()函数,将next设置为i+1,sum保持不变,sum_temp加上当前元素的值。
    static void bfs(int next,long sum,long sum_temp){
        if(sum_temp%2==0&&(sum-sum_temp)%2==0){
            ans++;
            ans=ans%1000000007;
        }
        // 这段代码的作用是:从数组的next位置开始,依次将后面的元素加入到sum_temp中,计算出所有可能的和为sum的组合。
        // 具体实现是通过递归实现的,每次递归调用时,将next加1,sum_temp加上当前位置的元素值,
        // 然后再次调用bfs函数,直到next等于数组长度或者sum_temp等于sum为止。
        for (int i=next;i<arr.length;i++){
            bfs(i+1,sum,sum_temp+arr[i]);
        }
    }
}
相关推荐
Fantasydg2 小时前
DAY 31 leetcode 142--链表.环形链表
算法·leetcode·链表
basketball6162 小时前
C++ STL常用算法之常用排序算法
c++·算法·排序算法
qystca3 小时前
蓝桥云客 岛屿个数
算法·dfs·bfs
码农老起3 小时前
与Aspose.pdf类似的jar库分享
java·pdf·jar
程序猿小D3 小时前
第三百八十九节 JavaFX教程 - JavaFX WebEngine
java·eclipse·intellij-idea·vr·javafx
什码情况3 小时前
回文时间 - 携程机试真题题解
数据结构·python·算法·华为od·机试
lwewan4 小时前
26考研——栈、队列和数组_数组和特殊矩阵(3)
数据结构·笔记·考研·算法
拾零吖5 小时前
枚举算法-day2
数据结构·算法·leetcode
已经成为了代码的形状5 小时前
关于交换并查集内元素的一些题的做法
数据结构·算法
self-discipline6345 小时前
【Java】Java核心知识点与相应面试技巧(七)——类与对象(二)
java·开发语言·面试