#include using namespace std; const int N = 1010; const int M = 110; int f[N][M][M]; int n, m1, m2; // 二维费用01背包-不少于维度费用,求最小代价 int main() { // 注意次序 cin >> m1 >> m2 >> n; // 求最小值 memset(f, 0x3f, sizeof f); f[0][0][0] = 0; for (int i = 1; i <= n; i++) { int v1, v2, w; cin >> v1 >> v2 >> w; for (int j = 0; j <= m1; j++) for (int k = 0; k <= m2; k++) { // 不选择i号物品 f[i][j][k] = f[i - 1][j][k]; // 分情况讨论 // 物品i加上就够一维使用,此时,只关心二维情况即可 if (j - v1 < 0 && k - v2 >= 0) f[i][j][k] = min(f[i][j][k], f[i - 1][0][k - v2] + w); // 物品i加上就够二维使用,此时,只关心一维情况即可 else if (j - v1 >= 0 && k - v2 < 0) f[i][j][k] = min(f[i][j][k], f[i - 1][j - v1][0] + w); // 如果选择了i号物品,两个维度直接拉满,那么只选择一个i就足够用,它参选的价值是w else if (j - v1 < 0 && k - v2 < 0) f[i][j][k] = min(f[i][j][k], w); else // 正常递推 f[i][j][k] = min(f[i][j][k], f[i - 1][j - v1][k - v2] + w); } } printf("%d\n", f[n][m1][m2]); return 0; }