longlong f[101][100001];
intmain(){
int N, M;
cin >> N >> M;
for (int i = 1; i <= N; i++) {
int w, v;
cin >> w >> v;
for (int j = 0; j < w; j++)
f[i][j] = f[i - 1][j];
for (int j = w; j <= M; j++)
f[i][j] = max(f[i - 1][j], f[i - 1][j - w] + v);
}
cout << f[N][M];
}
时间复杂度:
空间复杂度:
节省空间的写法
计算 的第 行()只需要 的第 行()。
longlong f[2][100001];
intmain(){
int N, M;
cin >> N >> M;
int x = 0, y = 1;
for (int i = 1; i <= N; i++) {
int w, v;
cin >> w >> v;
for (int j = 0; j < w; j++)
f[y][j] = f[x][j];
for (int j = w; j <= M; j++)
f[y][j] = max(f[x][j], f[x][j - w] + v);
swap(x, y);
}
cout << f[x][M];
}
longlong f[100005];
intmain(){
int N, M;
cin >> N >> M;
for (int i = 0; i < N; i++) {
int w, v;
cin >> w >> v; //来一个物品for (int j = M; j >= w; j--) //更新f数组
f[j] = max(f[j], f[j - w] + v);
}
cout << f[M];
}
longlong f[100005];
intmain(){
int N, M;
cin >> N >> M;
for (int i = 0; i < N; i++) {
int w, v;
cin >> w >> v; //来一种物品for (int j = w; j <= M; j++) //更新f数组
f[j] = max(f[j], f[j - w] + v);
}
cout << f[M];
}
int N, M;
longlong f[100005];
//来一个重量是w,价值是v的物品,更新f数组voiditem(int w, int v){
for (int j = M; j >= w; j--)
f[j] = max(f[j], f[j - w] + v);
}
voiditems(int a, int w, int v){
for (int i = 1; i < a; i *= 2) {
item(i * w, i * v);
a -= i;
}
item(a * w, a * v);
}
intmain(){
cin >> N >> M;
for (int i = 0; i < N; i++) {
int a, w, v;
cin >> a >> w >> v;
items(a, w, v);
}
cout << f[M];
}
intmain(){
int n, m;
cin >> n >> m;
vector<longlong> f(m + 1);// f[i-1][.]for (int i = 1; i <= n; i++) {
int v, w, a;
cin >> v >> w >> a;
for (int r = 0; r < w; r++) { // r:j除以w的余数
deque<pair<int, longlong>> q;//(t, g(t))for (int k = 0, j = r; j <= m; j += w, k++) {
// 计算 f[i][j] 之前要把 (k, g(k)) 放进队列longlong g = f[j] - k * v;
while (!q.empty() && g >= q.back().second)
q.pop_back();
q.push_back({k, g});
if (q[0].first < k - a)
q.pop_front();
f[j] = q[0].second + (longlong) k * v;
}
}
}
cout << f[m];
}