二分数字组合题解

182 阅读1分钟

问题描述

image.png

解题思路

思路1:动态规划

统计划分方式存在这几种情况:
方式1:所有个位数为A
方式2:所有的个位数为B
方式3:所有的个位数和为A/B
方式4:拆解成两个数组,A数组和B数组,统计等于A和B的个数

  1. 初始化动态规划数组:
    dp[i][a][b]表示前i个数字分成两组,第一组和个位数为a,第二组和个位数为b的组合数量。初始化dp[0][0][0]=1。(没有任何数字的时候,有一种方式使得和为0)。

  2. 状态转移

  • 如果放到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]
  1. 最终dp[n][a][b]既包含方式3也包含4
  2. 最终统计方式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
    }
}