b_mt_小团的车辆调度(需优化的01背包)
某个时刻A和B两地都向该公司提交了租车的订单,分别需要a和b辆汽车。通过北斗定位,可以得到所有车辆的位置,小团分别计算了每辆车前往A地和B地完成订单的利润。想让公司的利润最大化了。请你选择a辆车完成A地的任务,选择b辆车完成B地的任务。使得公司获利最大,每辆车最多只能完成一地的任务。
输入
第一行包含三个整数n,a,b,分别表示公司的车辆数量和A,B两地订单所需数量,保证a+b<=n。(1<=n<=2000)
接下来有n行,每行两个正整数x,y,分别表示该车完成A地任务的利润和B地任务的利润。
思路:可以省去第一维
#include<bits/stdc++.h>
using namespace std;
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n,a,b; cin>>n>>a>>b; //a,b 表示A,B两地订单所需数量
int f[a+5][b+5]; //f[i][j]表示a地排除i辆车,b地派出j辆车时的最大收益
memset(f,0,sizeof f);
for (int i=1; i<=n; i++) {
int x,y; cin>>x>>y; //x,y,分别表示该车完成A地任务的利润和B地任务的利润
for (int j=min(i,a); j; j--) {
for (int k=min(i-j,b); k; k--) {
f[j][k]=max(f[j][k], max({f[j-1][k]+x, f[j][k-1]+y, f[i-1][j-1]}));
}
}
}
cout<<f[a][b];
return 0;
}