小美的数组构造(美团2024届秋招笔试第二场编程真题)

题面

核心思想

dp[i][j] 表示前i个数字和为j时的组合数

那么第i个数的取法有 1 <= k <= j 需要遍历
第 i 个数取 k 前 i - 1 个数取 j - k 时 dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % MOD;
注意是和为j 第i个数取k 所以是dp[i][j]。

同时需要判断第i个数不能和a数组取相同的

代码

import java.util.*;

public class Main {

    public static void main(String[] args) {
        final long MOD = (long) (1e9 + 7);

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] nums = new int[n];
        int sum = 0;
        for(int i = 0; i < n; i++){
            nums[i] = scanner.nextInt();
            sum += nums[i];
        }

        long[][] dp = new long[n][501];
        for(int i = 1; i <= sum; i++){
            if(nums[0] != i)
                dp[0][i] = 1; // 第1个数除了a数组中的第1个 其他都能取
        }

        for(int i = 1; i < n; i++){
            for(int j = 1; j <= sum; j++){
                for(int k = 1; k <= j; k++){
                    if(nums[i] != k){
                        dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % MOD;
                    }
                }
            }
        }

        System.out.println(dp[n - 1][sum]);
    }
}
posted @ 2024-04-10 18:57  Shie1d  阅读(137)  评论(0)    收藏  举报