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