1 条题解

  • 0
    @ 2026-10-18 18:41:56

    G7009 [GESP202412 七级] 武器购买 题解

    知识点:0-1背包、动态规划、阈值。

    解题思路

    以费用为背包容量,dp[j]表示恰好花费j时可得最大威力,倒序处理每件武器。扫描费用从小到大找首个威力至少P的状态。

    为什么正确

    0-1转移穷尽选取武器的子集,保留同费用最大威力足以判断达标;第一次达标的费用就是最小值。

    易错点

    不可达费用用-1,不能默认为0;费用不超预算Q但仍无法达标时输出-1。

    复杂度

    每组时间O(nQ),空间O(Q)。

    参考代码(C++17)

    #include<bits/stdc++.h>
    
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int t;
        cin>>t;
        while(t--) {
            int n,P,Q;
            cin>>n>>P>>Q;
            vector<int>dp(Q+1,-1);
            dp[0]=0;
            while(n--) {
                int p,c;
                cin>>p>>c;
                for(int j=Q;j>=c;j--)if(dp[j-c]>=0)dp[j]=max(dp[j],dp[j-c]+p);
            }
            int ans=-1;
            for(int j=0;j<=Q;j++)if(dp[j]>=P) {
                ans=j;
                break;
            }
            cout<<ans<<"\n";
        }
    }
    

    说明

    本题解为配套教学整理,非官方题解。复杂度按本页参考实现计算,题库使用12个自行生成的测试点。

    • 1

    信息

    ID
    785
    时间
    1000ms
    内存
    512MiB
    难度
    普及
    标签
    递交数
    0
    已通过
    0
    上传者