学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
小猴王国的科学技术终于发展到可以发射太空火箭了!
火箭要装载的各种探测器、物资、宇航员我们统称为载荷;火箭要发射升空还需要燃料。火箭容量有限,载荷和燃料的总体积不能超过V。
目前有
n
n
n个载荷,第
i
i
i个载荷的体积为
v
i
v_i
vi,重量为
w
i
w_i
wi,我们要从
n
n
n个载荷中选出若干个装上火箭。剩余体积都装满燃料,每单位体积燃料的重量为
c
c
c,火箭本身的重量为
W
W
W。
为了火箭可以顺利升空,火箭整体的总重量(火箭重量、载荷重量、燃料重量之和)不能超过燃料体积乘以
k
k
k。
问在能保证火箭可以顺利升空的条件下,最多能装多重的载荷?
【输入】
第1行,5个正整数
n
,
W
,
V
,
c
,
k
n,W,V,c,k
n,W,V,c,k
接下来
n
n
n行,每行两个正整数
w
i
,
v
i
w_i,v_i
wi,vi
【输出】
输出1个整数,表示可以装载的最重的载荷。如果不装任何载荷都无法升空,输出-1。
【输入样例】
5 109 87 1 3
10 13
13 10
11 9
18 13
21 28
【输出样例】
24
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n, W, V, c, k;
int f[100005], ans;
int main()
{
scanf("%d%d%d%d%d", &n, &W, &V, &c, &k);
memset(f, 0x3f, sizeof(f)); // 初值设为无穷大
f[0] = 0; // 但重量为0时,最小体积也为0
for (int i=1; i<=n; i++) {
int wi, vi;
scanf("%d%d", &wi, &vi);
for (int j=100000; j>=wi; j--) { // 使用01背包滚动数组
f[j] = min(f[j], f[j-wi]+vi); // 求出每个重量的最小体积
}
}
ans = -1; // 无解对应的值
for (int i=0; i<=100000; i++) { // 枚举重量
if (f[i]<=V && (V-f[i])*k>=W+i+(V-f[i])*c) { // 要先判断体积是否超限,再按题目要求计算
ans = i; // 得到最大的重量
}
}
printf("%d\n", ans);
return 0;
}
【运行结果】
5 109 87 1 3
10 13
13 10
11 9
18 13
21 28
24