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; }