题面
核心思想
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