1 条题解
-
0
做法1: 认为价值等于体积
#include <bits/stdc++.h> #define int long long using namespace std; const int MAXN = 30; const int MAXM = 20000; int n, m; int v[MAXN + 5]; int dp[MAXM + 5]; signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> m >> n; for (int i = 1; i <= n; i++) cin >> v[i]; for (int i = 1; i <= n; i++) for (int j = m; j >= v[i]; j--) dp[j] = max(dp[j], dp[j - v[i]] + v[i]); cout << m - dp[m] << "\n"; return 0; }
做法2
#include <bits/stdc++.h> #define int long long using namespace std; const int MAXN = 30; const int MAXM = 20000; int n, m; int v[MAXN + 5]; bool dp[MAXM + 5]; // dp[i]: 能否装满 i 的体积 signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> m >> n; for (int i = 1; i <= n; i++) cin >> v[i]; dp[0] = true; for (int i = 1; i <= n; i++) for (int j = m; j >= v[i]; j--) { // 考虑j的体积能否装满 // 要不然是原来就能装满 // 要不然是用了第i件物品后就能装满了 // 前i-1件物品能装满剩余的空间 j-v[i] dp[j] = dp[j] || dp[j - v[i]]; } for (int i = m; i >= 0; i--) if (dp[i]) { cout << m - i; break; } return 0; }
- 1
信息
- ID
- 514
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 20
- 已通过
- 14
- 上传者