糖果 DP 01背包问题
🍑 算法题解专栏
🍑 糖果
输入
5 7
1
2
3
4
5
输出
14
🍑 DP 01背包
🍤 初始化 处理非法情况
🍤 负数取模问题
import java.util.Scanner;
public class Main
{
static int N = 110;
static int[] w = new int[N];
// 表示前 i 个物品 总价值%k == j 的集合
static int[][] f = new int[N][N];
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
for (int i = 1; i <= n; i++)
w[i] = sc.nextInt();
// 初始化, f[0][i]不合法( 0 件物品,余数必然为 0)
// f[0][1~n] 都为不合法不可能出现的状态,初始化成不影响求解的值
for (int i = 0; i <= n; i++)
for (int j = 0; j < N; j++)
f[i][j] = Integer.MIN_VALUE;// 全局初始化为 负无穷(无意义)(求最大值)
f[0][0] = 0;// 求最大值,所以 f[0][0] 时方案数 为0
for (int i = 1; i <= n; i++)
for (int j = 0; j <= k; j++)
// 不选当前物品 选当前物品(注意余数不能为负数)
f[i][j] = Math.max(f[i - 1][j], f[i - 1][(j - w[i] % k + k) % k] + w[i]);
System.out.println(f[n][0]);
}
}