1 条题解
-
0
满分做法
#include <bits/stdc++.h> using namespace std; const int MAXN = 1000; const int MAXM = 79; int n, m1, m2; int v1[MAXN + 5], v2[MAXN + 5], w[MAXN + 5]; int dp[MAXM + 5][MAXM + 5];//dp[i][j]: 提供i氧气、j氮气时的最小重量是多少 int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> m1 >> m2; cin >> n; for (int i = 1; i <= n; i++) cin >> v1[i] >> v2[i] >> w[i]; memset(dp, 0x3f, sizeof(dp)); // 初始化为无穷大(约 1e9) dp[0][0] = 0; for (int i = 1; i <= n; i++) for (int j1 = m1; j1 >= 0; j1--) for (int j2 = m2; j2 >= 0; j2--) { int jj1 = min(m1, j1 + v1[i]); // 使用了第i件物品后的第一种花费 int jj2 = min(m2, j2 + v2[i]); // 使用了第i件物品后的第二种花费 dp[jj1][jj2] = min(dp[jj1][jj2], dp[j1][j2] + w[i]); } cout << dp[m1][m2] << "\n"; return 0; }
非满分做法
如果不能理解
int jj2 = min(m2, j2 + v2[i]);
用处可以先看看这个做法#include <bits/stdc++.h> using namespace std; const int MAXN = 1000; int n, m1, m2; int v1[MAXN + 5], v2[MAXN + 5], w[MAXN + 5]; int dp[1000][10000]; // dp[i][j]: 提供i氧气、j氮气时的最小重量是多少 int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> m1 >> m2; cin >> n; int m1_MAX = 0, m2_MAX = 0; for (int i = 1; i <= n; i++) { cin >> v1[i] >> v2[i] >> w[i]; m1_MAX += v1[i]; m2_MAX += v2[i]; } assert(m1_MAX < 1000 && m2_MAX < 10000); memset(dp, 0x3f, sizeof(dp)); // 初始化为无穷大(约 1e9) dp[0][0] = 0; for (int i = 1; i <= n; i++) for (int j1 = m1_MAX; j1 >= v1[i]; j1--) for (int j2 = m2_MAX; j2 >= v2[i]; j2--) { if (dp[j1 - v1[i]][j2 - v2[i]] != 0x3f3f3f3f) dp[j1][j2] = min(dp[j1][j2], dp[j1 - v1[i]][j2 - v2[i]] + w[i]); } int ans = 0x3f3f3f3f; for (int j1 = m1_MAX; j1 >= m1; j1--) for (int j2 = m2_MAX; j2 >= m2; j2--) ans = min(ans, dp[j1][j2]); cout << ans << "\n"; return 0; }
- 1
信息
- ID
- 490
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 29
- 已通过
- 16
- 上传者