fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef pair<int, int> ii;
  7.  
  8. const int INF = 1e9;
  9. const ll LINF = 1e18;
  10.  
  11. template<typename T>
  12. void minimize(T& a, const T& b) {
  13. if (b < a) a = b;
  14. }
  15.  
  16. const int N = 1e2 + 5;
  17. const int MX = 1e5 + 5;
  18.  
  19. int n, W;
  20. int w[N], v[N];
  21.  
  22. ll dp[N][MX]; // dp[i][j] = Tổng khối lượng nhỏ nhất khi xét đến món vật thứ i và tổng giá trị hiện tại là j
  23.  
  24. int main() {
  25. ios::sync_with_stdio(false);
  26. cin.tie(nullptr);
  27. cin >> n >> W;
  28. for (int i = 1; i <= n; i++) {
  29. cin >> w[i] >> v[i];
  30. }
  31.  
  32. for (int i = 0; i <= n; i++) {
  33. for (int j = 0; j < MX; j++) dp[i][j] = LINF;
  34. }
  35.  
  36. dp[0][0] = 0;
  37. for (int i = 0; i < n; i++) {
  38. for (int j = 0; j < MX; j++) {
  39. if (dp[i][j] == LINF) continue;
  40. // không chọn món vật thứ i + 1
  41. minimize(dp[i + 1][j], dp[i][j]);
  42.  
  43. // chọn món vật thứ i + 1
  44. minimize(dp[i + 1][j + v[i + 1]], dp[i][j] + w[i + 1]);
  45. }
  46. }
  47.  
  48. ll max_sum_v = 0;
  49. for (int j = 0; j < MX; j++) {
  50. if (dp[n][j] <= W) max_sum_v = j;
  51. }
  52.  
  53. cout << max_sum_v << '\n';
  54. }
Success #stdin #stdout 0.01s 6796KB
stdin
3 8
3 30
4 50
5 60
stdout
90