Description

Input

1 <= T <= 20
1 <= n, v <= 100000
1 <= ai, bi <= 100000
Output

Sample Input
1
4 2
1 2
2 1
3 1 2 3
Sample Output
yes
思路
由于物体要先放进去才能扩大自己的体积,可以先把物体按它们的体积由小到大排序,若体积相同则选择喜爱程度高的物体排在前。
优先选择哪些物体装进背包可以遵循以下规则:
1.先按物品体积从小到大先装背包体积大于物品体积并且物品的喜爱程度大于物品体积的(目的是尽可能扩大背包容量)
2.后按物品体积从小到大装剩下的物品
代码
#include<stdio.h>
#include<algorithm>
using namespace std;
#define MAX 100005
int n,v;
struct node{
int vi;
int pi;
int mark;
}e[MAX];
bool compare(node x,node y)
{
if(x.vi==y.vi)
return x.pi>y.pi;
return x.vi<y.vi;
}
int main()
{
int T,i;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&v);
for(i=0;i<n;i++)
{
scanf("%d%d",&e[i].vi,&e[i].pi);
e[i].mark=0;
}
sort(e,e+n,compare);
int num=0;
for(i=0;i<n;i++)
{
if(v>=e[i].vi&&e[i].pi-e[i].vi>=0)
{
v+=e[i].pi-e[i].vi;
e[i].mark=1;
num+=1;
}
}
for(i=0;i<n;i++)
{
if(!e[i].mark&&v>=e[i].vi)
{
v+=e[i].pi-e[i].vi;
num+=1;
}
}
if(num!=n)
printf("no\n");
else
printf("yes\n");
}
return 0;
}
本文探讨了一种背包填充策略,旨在通过优化物体的体积与喜爱度来最大化背包容量。首先,将物体按体积由小到大排序,体积相同时按喜爱度排序。然后,优先选择体积小于背包剩余空间且喜爱度高于体积的物体,以增加背包容量。最后,再填充剩余的物体。此策略确保了背包的高效利用。
717

被折叠的 条评论
为什么被折叠?



