问题描述
解题思路
思路1:动态规划
统计划分方式存在这几种情况:
方式1:所有个位数为A
方式2:所有的个位数为B
方式3:所有的个位数和为A/B
方式4:拆解成两个数组,A数组和B数组,统计等于A和B的个数
-
初始化动态规划数组:
dp[i][a][b]表示前i个数字分成两组,第一组和个位数为a,第二组和个位数为b的组合数量。初始化dp[0][0][0]=1。(没有任何数字的时候,有一种方式使得和为0)。 -
状态转移
- 如果放到A组
if(dp[i][a][b]>0) dp[i+1][(a+num[i])%10][b]+=dp[i][a][b] - 如果放到B组
if(dp[i][a][b]>0) dp[i+1][a][(b+num[i])%10]+=dp[i][a][b]
- 最终
dp[n][a][b]既包含方式3也包含4 - 最终统计方式1和方式2的情况。
完整代码:
import java.util.Arrays;
public class Main {
public static int solution(int n, int A, int B, int[] array) {
int[][][] dp = new int[n + 1][10][10];
dp[0][0][0] = 1;
for (int i = 0; i < n; i++) {
for (int a = 0; a < 10; a++) {
for (int b = 0; b < 10; b++) {
if (dp[i][a][b] > 0) {
dp[i + 1][(a + array[i]) % 10][b] += dp[i][a][b];
dp[i + 1][a][(b + array[i]) % 10] += dp[i][a][b];
}
}
}
}
int result = dp[n][A][B];
int total=0;
for(int i=0;i<n;i++)
{
total+=array[i];
}
if(total%10==A)
result+=1;
if(total%10==B)
result+=1;
return result;
}
public static void main(String[] args) {
System.out.println(solution(3, 1, 2, new int[] { 1, 1, 1 })); // 输出应为 3
System.out.println(solution(3, 3, 5, new int[] { 1, 1, 1 })); // 输出应为 1
System.out.println(solution(2, 1, 1, new int[] { 1, 1 })); // 输出应为 2
System.out.println(solution(5, 3, 7, new int[] { 2, 3, 5, 7, 9 })); // 输出应为 0
}
}