问题描述
小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。
numbers
: 一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。小M需要从每个数字组中选择一个数字。
例如对于[123, 456, 789]
,14个符合条件的数为:147 149 158 167 169 248 257 259 268 347 349 358 367 369
。
测试样例
样例1:
输入:
numbers = [123, 456, 789]
输出:14
样例2:
输入:
numbers = [123456789]
输出:4
样例3:
输入:
numbers = [14329, 7568]
输出:10
#include <functional>
#include <iostream>
#include <string>
#include <vector>int solution(std::vector<int> numbers) {// Please write your code hereint sum=0;std::vector<int> ou(numbers.size(),0);std::vector<int> qi(numbers.size(),0);for(int i=0;i<numbers.size();i++){std::string temp=std::to_string(numbers[i]);for(char c:temp){int tempint=c-'0';if(tempint%2==0){ou[i]++;}else {qi[i]++;}}}//递归函数计算组合数std::function<void(int, int)>dfs=[&](int index,int currentSum){//边界条件:遍历完所有数字组if(index==numbers.size()){//检查当前的和是否为偶数if(currentSum%2==0){sum++;}return ;}//选择当前数字组中的偶数// 选择当前数字组中的偶数for (int i = 0; i < ou[index]; i++) {dfs(index + 1, currentSum + 0);}// 选择当前数字组中的奇数for (int i = 0; i < qi[index]; i++) {dfs(index + 1, currentSum + 1);}};//调用递归函数dfs(0,0);return sum;
}int main() {// You can add more test cases herestd::cout << (solution({123, 456, 789}) == 14) << std::endl;std::cout << (solution({123456789}) == 4) << std::endl;std::cout << (solution({14329, 7568}) == 10) << std::endl;return 0;
}