1 条题解
-
0
#include <iostream> #include <vector> #include <algorithm> using namespace std; void knapsack_01(vector<int>& dp, int weight, int value, int capacity) { for (int j = capacity; j >= weight; --j) { dp[j] = max(dp[j], dp[j - weight] + value); } } void knapsack_complete(vector<int>& dp, int weight, int value, int capacity) { for (int j = weight; j <= capacity; ++j) { dp[j] = max(dp[j], dp[j - weight] + value); } } void knapsack_multiple(vector<int>& dp, int weight, int value, int count, int capacity) { if (weight * count >= capacity) { // 如果总的重量超过了容量,转为完全背包问题 knapsack_complete(dp, weight, value, capacity); } else { // 否则使用二进制优化多重背包 for (int k = 1; k <= count; k <<= 1) { knapsack_01(dp, k * weight, k * value, capacity); count -= k; } if (count > 0) { knapsack_01(dp, count * weight, count * value, capacity); } } } int main() { int M, N; cin >> M >> N; vector<int> weights(N); vector<int> values(N); vector<int> counts(N); for (int i = 0; i < N; ++i) { cin >> weights[i] >> values[i] >> counts[i]; } vector<int> dp(M + 1, 0); for (int i = 0; i < N; ++i) { if (counts[i] == 0) { knapsack_complete(dp, weights[i], values[i], M); } else if (counts[i] == 1) { knapsack_01(dp, weights[i], values[i], M); } else { knapsack_multiple(dp, weights[i], values[i], counts[i], M); } } cout << dp[M] << endl; return 0; }
- 1
信息
- ID
- 477
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 3
- 上传者