1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int n, V; // int v[10010]; int w[10010]; int s[10010]; int dp[10010]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> V; for (int i = 1; i <= n; i++) { cin >> v[i] >> w[i] >> s[i]; } for (int i = 1; i <= n; i++) { if (s[i] == -1) { for (int j = V; j >= v[i]; j--) { dp[j] = max(dp[j], dp[j - v[i]] + w[i]); } } else if (s[i] == 0) { for (int j = v[i]; j <= V; j++) { dp[j] = max(dp[j], dp[j - v[i]] + w[i]); } } else { // 二进制优化 s[i] 拆成 1,2,4,8,16,32...2^p 和s[i] - (1,2,4,8,16,32...2^p)的和 (s[i] - (1,2,4,8,16,32...2^p) 无法再拆出 2^q (q > p)) // 显然 这些数任意组合 可以得到1到s[i]的任何数 int p = s[i]; // 剩余的数 for (int j = 1; j <= p; j = j * 2) { for (int k = V; k >= v[i] * j; k--) { dp[k] = max(dp[k], dp[k - v[i] * j] + w[i] * j); } p -= j; } if (p > 0) { for (int k = V; k >= v[i] * p; k--) { dp[k] = max(dp[k], dp[k - v[i] * p] + w[i] * p); } } } } cout << dp[V] << endl; return 0; }
- 1
信息
- ID
- 2261
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 23
- 已通过
- 7
- 上传者