#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
#include <cmath>
#include <map>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int MN = 65005;
const int MAXN = 100005;
const int INF = 0x3f3f3f3f;
#define reg register
#define IOS ios::sync_with_stdio(false)
ll n, W;
ll v[MAXN];
ll p[MAXN];
ll dp[100000005];
bool cmp(int a, int b) {
return a > b;
}
int main() {
scanf("%lld %lld", &n, &W);
ll minv = INF;
ll maxv = 0;
for (int i = 1; i <= n; i++) {
scanf("%lld %lld", v + i, p + i);
minv = min(v[i], minv);
maxv = max(v[i], maxv);
}
if (minv <= 300) {
for (int i = 1; i <= n; i++) {
for (int j = W; j >= v[i]; j--) {
dp[j] = max(dp[j], dp[j - v[i]] + p[i]);
}
}
printf("%lld", dp[W]);
} else {
ll sum = 0;
sort(p + 1, p + n + 1, cmp);
for (int i = 1; i <= W / minv; i++) {
sum += p[i];
}
printf("%lld", sum);
}
return 0;
}
P3985 不开心的金明(贪心+01背包)
最新推荐文章于 2025-12-31 21:25:26 发布
本文介绍了一种解决背包问题的有效算法。针对不同价值密度的物品,采用动态规划进行求解。当物品价值密度较低时,利用传统的动态规划方法;而对于高价值密度物品,则通过排序和累积求和的方式快速得出近似最优解。

1169

被折叠的 条评论
为什么被折叠?



