hdu3177Crixalis's Equipment 差值排序

/*
    题目描述:有容量为V的空间,n件物品,每种物品有a[i],b[i]两个量,当空间的剩余容量大于等于b[i]时,可以将i物品放进该空间,放进去
                    之后空间的容量变为V - a[i],现问是否能根据一定顺序将所有的物品放入该空间?
    方法:问题可以转化成怎么放置可以使n件物品需要的空间(不是占用的空间,n件物品全部放入后占用的空间是一定的)最小;
             考虑两物品的情况a1,b1  (物品一),a2,b2(物品二),先放物品一,再放物品二所需要的最小空间是 max(b1,a1 + b2) ,反过来放的
             最小空间是max(b2, a2 + b1),即比较两件物品的a1 + b2 与 a2 + b1 的大小,即比较两件物品的a1 - b1与a2 - b2 的大小
             (是不是好像有哪里还不太严密?对,上述比较没有考虑b1 > a1 + b2 或 b2 >a2 + b1的情况。其实,以b1 > a1 + b2 为例,由此式
              易得a2 + b1  > a1 + b2,所以还是应该先放一再放二,所以按上述顺序排在这两种情况下也是成立的)
    收获:1、合理的转化问题,转化为放n件需要的空间而不是占用的空间
             2、重视贪心的最优子结构性质,把n个的问题转化为2个的问题,最优子结构性质是简单的贪心题目当中难以切实体会到的
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
const int maxn = 1e3 + 5;
struct node
{
    int a , b;
}item[maxn];
bool cmp(const node & u, const node & v)
{
        return u.b - u. a > v.b - v.a;
}
int main()
{
    int V,n,T;
    scanf("%d",&T);
    while(T--){
        scanf("%d %d",&V,&n);
        int sum = 0;
        for(int i = 1;i<=n;i++){
            scanf("%d%d",&item[i].a , &item[i].b);
            sum += item[i].a;
        }
        if(sum > V){
            printf("No\n");
            continue;
        }
        sort(item + 1 , item + 1 + n , cmp);
        int i = 1 ;
        while(i<=n&&V >= item[i].b){
            V -= item[i].a;
            i++;
        }
        if(i==n + 1)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值