简要题意:有 n 块木石,每块的体积为 k,搬运所需体力为 m。海的剩余体积为 v,精卫剩余体力为 c。求在海被填满的情况下(能超出),精卫所能剩余体力的最大值。
题目分析:
这是一道01背包题,首先用01背包模板求出在消耗体力为 x 的情况下,填海体积的最大值。状态转移方程如下:
f(x) = max(f(x), f(x - k[y]) + m[y])
x:消耗体力值 y:木石序号
在求出消耗体力为 x 的情况下,填海体积的最大值后,对是否能填满进行判断。如果 f[c] < k,即在消耗所有体力的情况下,所填体积小于需填体积,输出“Impossible”。反之则从 f[c] ~ f[1] 从大到小判断,求出在能填满时所剩体力的最大值。
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
int k[10005], m[10005], dp[10005];
int v, n, c;
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]);
if (dp[c] < v) {
puts("Impossible");
} else {
int cnt = c;
while (dp[cnt] >= v) {
cnt--;
}
printf("%d", c - cnt - 1);
}
return 0;
}
抱天下工作室招人
要求:
- 年龄不限
- 有担当
- 有自己擅长的编程语言
- 愿意接受不定薪资(¥RMB)
- 有奉献精神
- 服从集体
- 敢于发言
有意者加Q群:536950507