文章

211

粉丝

0

获赞

963

访问

32.6k

头像
Buyer 题解:
P1567
发布于2026年2月20日 10:10
阅读数 181

#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]...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发