糖果 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]);
	}
}
posted @ 2023-04-25 18:34  兑生  阅读(22)  评论(0编辑  收藏  举报  来源
Live2D