伴学笔记6

82 阅读2分钟

小F面临一个有趣的挑战:给定一个数组,她需要将数组中的数字分为两组。分组的目标是使得一组数字的和的个位数等于给定的 A,另一组数字的和的个位数等于给定的 B。除此之外,还有一种特殊情况允许其中一组为空,但剩余数字和的个位数必须等于 A 或 B。小F需要计算所有可能的划分方式。问题描述给定一个整数数组 array_a 和两个目标整数 A 和 B,需要将数组分为两组,使得:

  • 一组数字的和的个位数等于 A。

  • 另一组数字的和的个位数等于 B。

  • 允许其中一组为空,但剩余数字和的个位数必须等于 A 或 B。

输入变量说明:

  • n:数组的长度。

  • A:目标整数 A。

  • B:目标整数 B。

  • array_a:给定的整数数组。

测试样例样例1:输入:n = 3, A = 1, B = 2, array_a = [1, 1, 1]输出:3样例2:输入:n = 3, A = 3, B = 5, array_a = [1, 1, 1]输出:1样例3:输入:n = 2, A = 1, B = 1, array_a = [1, 1]输出:2样例4:输入:n = 5, A = 3, B = 7, array_a = [2, 3, 5, 7, 9]输出:0问题分析我们需要计算所有可能的划分方式,使得分组后的数字和的个位数满足给定条件。题目中给出的关键信息包括:

  • 数组可以分为两组,且每组的和的个位数需要满足特定条件。

  • 允许其中一组为空。

关键思路1. 动态规划:使用动态规划来计算所有可能的分组方式。2. 状态转移:根据当前数字的和的个位数,更新可能的分组方式。3. 特殊情况处理:考虑一组为空的情况。代码实现

public class ArrayGrouping {

    public static int countWays(int n, int A, int B, int[] array_a) {

        int[] dp = new int[10];

        dp[0] = 1; // 初始状态,和为0的情况

        for (int num : array_a) {

            int[] newDp = new int[10];

            for (int i = 0; i < 10; i++) {

                if (dp[i] > 0) {

                    newDp[(i + num) % 10] += dp[i];

                }

            }

            for (int i = 0; i < 10; i++) {

                dp[i] += newDp[i];

            }

        }

        int totalSum = 0;

        for (int num : array_a) {

            totalSum += num;

        }

        int result = 0;

        if (dp[A] > 0) result += dp[A];

        if (dp[B] > 0) result += dp[B];

        if (totalSum % 10 == A || totalSum % 10 == B) result++;

        return result;

    }

    public static void main(String[] args) {

        // 测试样例

        System.out.println(countWays(3, 1, 2, new int[]{1, 1, 1})); // 输出: 3

        System.out.println(countWays(3, 3, 5, new int[]{1, 1, 1})); // 输出: 1

        System.out.println(countWays(2, 1, 1, new int[]{1, 1}));    // 输出: 2

        System.out.println(countWays(5, 3, 7, new int[]{2, 3, 5, 7, 9})); // 输出: 0

    }

}

代码说明

1. 动态规划:使用一个数组 dp 来记录当前和的个位数的可能性。

  • 状态转移:对于每个数字,更新 dp 数组,计算新的和的个位数。

  • 特殊情况处理:考虑一组为空的情况,检查总和的个位数是否等于 A 或 B。