青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

41 阅读3分钟

二分数字组合 (原35.二分数字) 问题描述(原问题题干) 给定一个数组,请你把数组里的数字分为两组,使一组数字和的个位数等于 A(1 ≤ A ≤ 9),且剩余数字和的个位数等于 B(1 ≤ B ≤ 9);或者一组数字的个数为零,但剩余数字和的个位数等于 A 或 B。请问一共有多少种划分方式? 解题思路 1.计算总和:首先计算数组所有元素的总和,记为total_sum。 2.确定目标个位数:确定目标个位数A的十位数和个位数,记为target_tenstarget_units。 3.调整总和:通过调整total_sum,使其个位数等于A的个位数。这可以通过在总和的基础上加减适当的值来实现,但需要保证总和的十位数不变。 4.分组:将调整后的总和分为两组,使得一组数字的和的个位数等于A。这可以通过动态规划或递归的方法来实现。

具体实现步骤 1.计算总和:使用Python的内置函数sum()计算数组所有元素的总和。 2.确定目标个位数:将目标数A分解为十位数和个位数。 3.调整总和:通过加减适当的值来调整总和的个位数,同时保证十位数不变。这可以通过简单的数学运算来实现。 4.分组:使用动态规划或递归的方法将调整后的总和分为两组,使得一组数字的和的个位数等于A

备注: 数组里的数字可以相等,但每个数字都是独一无二的。 比如数组 a 等于[1, 1, 1],A 等于 1,B 等于 2,则一共有三组划分方式: 第一种: A:a[0] B:a[1]、a[2] 第二种: A:a[1] B:a[0]、a[2] 第三种: A:a[2] B:a[0]、a[1]

可以将所有数字都划分到同一组,使其和的个位数等于 A 或 B;另一组为空 比如数组 a 等于[1, 1, 1],A 等于 3,B 等于 5,则共有一组划分方式: A:a[0]、a[1]、a[2] B:空

输入格式 输入第一行包含三个整数 n、A、B(1 ≤ n ≤ 100000,1 ≤ A ≤ 9,1 ≤ B ≤ 9),n 代表需要数组中的数字个数。 第二行,有 n 个元素,代表数组内的数字(1 ≤ 每个数字 ≤ 9)。

输出格式 输出一共有多少种划分方式,结果对 10000007 取余。

输入样例 样例 1 3 1 2 1 1 1 样例 2 3 3 5 1 1 1 样例 3 2 1 1 1 1 输出样例 样例 1 3 样例 2 1 样例 3 2

py代码: def solution(n, A, B, array_a): array_a = [x % 10 for x in array_a]

total_sum = sum(array_a)
total_sum %= 10
if (total_sum == A or total_sum == B):
    return 1
if (total_sum != (A + B) % 10):
    return 0

f = [[0 for _ in range(10)] for _ in range(n + 1)]
f[0][0] = 1
for i in range(1 , n + 1):
    for j in range(10):
        f[i][j] += f[i - 1][j]
        f[i][j] += f[i - 1][(j - array_a[i - 1] + 10) % 10]

return f[n][B]

if name == "main": # You can add more test cases here print(solution(3, 1, 2, [1,1,1]) == 3 ) print(solution(3, 3, 5, [1,1,1]) == 1 ) print(solution(2, 1, 1, [1,1]) == 2 ) print(solution(13 , 8 , 3 , [21,9,16,7,9,19,8,4,1,17,1,10,16]) == 1)