简单的背包——01背包(6)
题目来源:洛谷 P1510 精卫填海
共十个测试点
题解
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;
int v, n, c;
int k, m;
// f[x] 表示 x 体力可以搬运的石头的体积最大值
int f[maxn];
int main()
{
memset(f, 0, sizeof(f));
scanf("%d%d%d", &v, &n, &c);
for (int i = 1; i <= n; ++i)
{
scanf("%d%d", &k, &m);
for (int j = c; j >= m; --j)
{
f[j] = max(f[j], f[j - m] + k);
}
}
if (f[c] >= v)
// lower_bound(begin,end,number) 返回数组中首次大于等于 number 的数的地址
// 详细解释见 简单的二分查找——二分(2)
printf("%d", c - (lower_bound(f + 1, f + c + 1, v) - f));
else
printf("Impossible");
return 0;
}