F - Crixalis's Equipment(贪心)

题意:给定个物品的体积和能装下该物品的最小剩余容量和背包体积,问能否装下所有物品。

思路:贪心,因为要让所有物品能被装下,显然要为较大的留下更大的空间,又因为要使后面的物品也能被装下,腾出更多空间,所以要尽可能地小,因此可以想到贪心的策略是尽可能越大越好,这样既满足大的同时小,这里说几个错误的贪心策略。

越小越好,显然不对。


越大越好,这样显然是错的,如果该物品的也很大,这样后面较大的物品就装不下,

显然装了第二个物品后第一个物品就装不下了,但先装第一个物品,剩下的空间就够装第二个物品。


越大越好,这样显然也不行,因为这是相对大小,不是实际大小,

显然先装第一个物品剩余的空间不能满足更大的.

时间复杂度:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e3+5;
#define mst(a) memset(a,0,sizeof a)
struct p{
    int x,y;
}a[N];
bool cmp(p a,p b){
    return a.y-a.x==b.y-b.x?a.y>b.y:a.y-a.x>b.y-b.x;
}
int n,t,v;
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&v,&n);
        for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
        sort(a+1,a+n+1,cmp);
        int ok=0,cnt=0;
        for(int i=1;i<=n;i++){
            if(v>=a[i].y&&v>=a[i].x){
                v-=a[i].x;
                cnt++;
            }
        }
        if(cnt==n) puts("Yes");
        else puts("No");
    }
    return 0;
}