题解 | #【模板】01背包(方案输出)#
【模板】01背包(方案输出)
https://www.nowcoder.com/practice/763a853b4d1943f095a9716af7e3d067
没想到竟然过了
代码实现
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 1e4 + 10, MOD = 998244353;
const LL INF = 1e18;
int n, m;
LL v[N], w[N];
void solve() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) cin >> v[i] >> w[i];
vector<vector<LL>> f(n + 1, vector<LL>(m + 1));
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= m; ++j) {
f[i][j] = f[i - 1][j];
if (j >= v[i]) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
}
}
vector<int> ans;
int j = m;
for (int i = n; i >= 1; --i) {
if (j >= v[i] && f[i - 1][j - v[i]] + w[i] == f[i][j]) {
ans.push_back(i);
j -= v[i];
}
}
cout << ans.size() << '\n';
for (int i : ans) cout << i << ' ';
cout << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
while (T--) solve();
return 0;
}