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

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

时间:2024-04-10 19:13:21浏览次数:23  
标签:scanner nums 真题 int 美团 届秋招 个数 long dp

题面

核心思想

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]);
    }
}

标签:scanner,nums,真题,int,美团,届秋招,个数,long,dp
From: https://www.cnblogs.com/ganyq/p/18127179

相关文章