全部评论 4

  • 贴一下我写的代码qwq

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    struct node{
        int w,v,idx,f; // w价格 v价值 idx分组 f是否为主件
    };
    signed main(){
        int n,m;
        cin>>n>>m;
        vector<node> a(m+1);
        for(int i=1;i<=m;i++){
            int v,p,q;
            cin>>v>>p>>q;
            if(q == 0){
                a[i].idx = i;
                a[i].f = 0;
                a[i].v = v*p;
                a[i].w = v;
            }else{
                a[i].idx = q;
                a[i].f = 1;
                a[i].v = v*p;
                a[i].w = v;
            }
        };
        sort(a.begin()+1,a.end(),[](node a,node b){
            if(a.idx == b.idx) return a.f < b.f;
            return a.idx < b.idx;
        });
        
        vector<int> dp(n+1);
        for(int i=1;i<=m;i++){
            if(a[i].f) continue;
            for(int j=n;j>=a[i].w;j--){
                // 策略1 只买主件(01板)
                dp[j] = max(dp[j],dp[j-a[i].w]+a[i].v);
    
                // 策略2 买第一个附件
                if(
                    i+1 <= m && // 防止越界
                    a[i+1].idx == a[i].idx && // 下一个是附件
                    j >= a[i].w+a[i+1].w // 买得起
                ){
                    dp[j] = max(dp[j], dp[j - a[i].w - a[i+1].w] + a[i].v + a[i+1].v);
                }
    
                // 策略3 买第二个附件
                if(
                    i+2 <= m && // 防止越界
                    a[i+2].idx == a[i].idx && // 下下一个是附件
                    j >= a[i].w+a[i+2].w // 买得起
                ){
                    dp[j] = max(dp[j], dp[j - a[i].w - a[i+2].w] + a[i].v + a[i+2].v);
                }
    
                // 策略4 两个附件都买
                if(
                    a[i+1].idx == a[i].idx && // 下一个是附件
                    a[i+2].idx == a[i].idx && // 下下一个是附件
                    j >= a[i].w+a[i+1].w+a[i+2].w // 买得起
                ){
                    dp[j] = max(dp[j], dp[j - a[i].w - a[i+1].w - a[i+2].w] + a[i].v + a[i+1].v + a[i+2].v);
                }
            }
        }
        cout<<dp[n];
        return 0;
    }
    

    2026-07-27 来自 辽宁

    0
  • 希望大家捧个场(bushi

    2025-04-26 来自 浙江

    0
  • https://www.luogu.com.cn/article/ismpccjh

    2025-04-26 来自 浙江

    0
  • 从个人你谷专栏里搬过来的,望谅解

    2025-04-26 来自 浙江

    0
暂无数据

提交答案之后,这里将显示提交结果~

首页