文章
211
粉丝
0
获赞
963
访问
32.6k
#include <bits/stdc++.h>
using namespace std;
int dp[1005][101]; // dp[i][j]:前i个物品,花费j的最大价值
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int M, N;
while (cin >> M >> N) {
vector<int> cost(N + 1), val(N + 1);
for (int i = 1; i <= N; i++) {
cin >> cost[i] >> val[i];
}
// 标准01背包
for (int i = 1; i <= N; i++) {
for (int j = 0; j <= M; j++) {
dp[i][j] = dp[i-1][j];
if (j >= cost[i]) {
dp[i][j] = max(dp[i][j], dp[i-1][j-cost[i]] + val[i]);
}
}
}
int maxVal = dp[N][M];
// 回溯构造方案:优先不选,保证字典序最小
vector<int> ans;
int i = N, j = M;
while (i > 0 && j >= 0) {
// 优先不选:如果dp[i][j] == dp[i-1][j],说明不选i也能达到最优
if (dp[i][j] == dp[i-1]...
登录后发布评论
暂无评论,来抢沙发