洛谷 P1510 精卫填海 题解

题目链接

洛谷 P1510 精卫填海

思路分析

由于不论是哪种背包,解决的都是小于等于某个阈值的问题,所以这道题中我们也应选择小于等于类的条件进行 DP。题目中只有体力符合条件,便以体力为重量、体积为价值进行 0-1 背包。再枚举每个体力值,找到最小的能填平东海的所需体力,减一减便是最终答案。

代码呈现

#include<bits/stdc++.h>
using namespace std;

const int N=1e4+10;
int v,n,c;
int k[N],m[N],dp[N];

int main(){
    scanf("%d%d%d",&v,&n,&c);
    for (int i=1;i<=n;++i) scanf("%d%d",k+i,m+i);
    for (int i=1;i<=n;++i){
        for (int j=c;j>=m[i];--j) dp[j]=max(dp[j],dp[j-m[i]]+k[i]);
    }
    for (int i=0;i<=c;++i){
        if (dp[i]>=v){ printf("%d",c-i);return 0; }
    }
    printf("Impossible");
    return 0;
}
posted @ 2025-12-28 20:58  CodingJuRuo  阅读(13)  评论(0)    收藏  举报