洛谷 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;
}

浙公网安备 33010602011771号