import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int m = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
int[][] a = new int[101][n + 1];
int[][] b = new int[101][n + 1];
int[] p = new int[n + 1]; // 存放第i个小组的物品数
int maxGroups = 0;
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine());
int aa = Integer.parseInt(st.nextToken()); // 重量
int bb = Integer.parseInt(st.nextToken()); // 价值
int cc = Integer.parseInt(st.nextToken()); // 组数
p[cc]++;
maxGroups = Math.max(maxGroups, cc); // 得出最大组数
a[cc][p[cc]] = aa;
b[cc][p[cc]] = bb;
}
int[] dp = new int[m + 1];
for (int i = 1; i <= maxGroups; i++) {
for (int j = m; j >= 1; j--) { // 分组背包先遍历容量
for (int k = 1; k <= p[i]; k++) { // 遍历物品
if (j >= a[i][k]) dp[j] = Math.max(dp[j], dp[j - a[i][k]] + b[i][k]);
}
}
}
System.out.println(dp[m]);
}
}
分组背包模板题,和01背包的主要区别在于每件物品最多选1件,先遍历背包容量,再遍历物品,记得判断容量是否足够。