洛谷 P1510 精卫填海

01背包,只不过是找选择全部物品且最大化填海体积的同时,满足题目所需要最小的体力值。
必须要明白做dp时,下标的含义,当dp为二维时,dp[i][j]表示在前i个物品下,j体力的最大填充v,因此题目就是找dp数组最后一行,从左往右第一个大于题目指定v的那个元素的下标j。

AcCode:

#include<iostream>
using namespace std;
int dp[10010], d[10010], e[10010];
int main(){
    int v, n, c;
    cin >> v >> n >> c;
    for(int i = 1; i <= n; i++) cin >> d[i], cin >> e[i];

    for(int i = 1; i <= n; i++)
      for(int j = c; j >= e[i]; j--)
        dp[j] = max(dp[j], dp[j - e[i]] + d[i]);

    for(int i = 1; i <= c; i++)
      if(dp[i] >= v){
          cout << c - i << endl;
          return 0;
      }

    cout << "Impossible" << endl;
    return 0;
}
posted @ 2025-06-24 21:17  Yuhhhhh  阅读(9)  评论(0)    收藏  举报