蓝桥杯数组分割

小蓝有一个长度为 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]);
        }
    }
}
相关推荐
violin-wang14 分钟前
Intellij IDEA调整栈内存空间大小详细教程,添加参数-Xss....
java·ide·intellij-idea·xss·栈内存·栈空间
在下陈平安16 分钟前
java-LinkedList源码详解
java·开发语言
黑客老李19 分钟前
一次使用十六进制溢出绕过 WAF实现XSS的经历
java·运维·服务器·前端·sql·学习·xss
_不会dp不改名_24 分钟前
leetcode_80删除有序数组中的重复项 II
数据结构·算法·leetcode
√尖尖角↑25 分钟前
力扣——【104. 二叉树的最大深度】
python·算法·leetcode
幸运小圣25 分钟前
LeetCode热题100- 轮转数组【JavaScript讲解】
javascript·算法·leetcode
MYX_30925 分钟前
第七节 文件与流
开发语言·c++·学习·算法
Mao.O30 分钟前
IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决
java·spring boot·intellij-idea·lombok
Lostgreen32 分钟前
解密K-means:简单易懂的算法指南
算法·机器学习·kmeans
muxue1782 小时前
数据结构:栈
java·开发语言·数据结构