注解
1、贪心算法。贪心策略是按最大瞬时体积排序。如果要搬运x和y两个物品,且两个物品的移动体积x.b和y.b均小于当前所剩体积,那么按x.a+y.b和y.a+x.b从小到大排序。原因是,先搬运a再搬运b时的最大瞬时体积是x.a+y.b,而先搬运b再搬运a时的最大瞬时体积是y.a+x.b。
2、贪心策略的选择是关键。必须同时考虑两物品的先后搬运顺序,而不能只考虑一个物品。如果按单个物品体积排序,这个贪心策略是错误的。
代码
#include <iostream>
#include <algorithm>
using namespace std;
struct Equip {
int a;
int b;
};
int compare(Equip e1, Equip e2) {
return e1.a+e2.b<e1.b+e2.a;
}
int main() {
int T;
cin>>T;
for(int i=0; i<T; i++) {
int V, N;
cin>>V>>N;
Equip equip[N];
for(int j=0; j<N; j++) {
cin>>equip[j].a>>equip[j].b;
}
sort(equip, equip+N, compare);
int flag = 1;
for(int j=0; j<N; j++){
if(V>=equip[j].b){
V -= equip[j].a;
}
else{
flag = 0;
break;
}
}
if(flag){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
return 0;
}