Clarke and food
Accepts: 353
Submissions: 962
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
克拉克是一名人格分裂患者。某一天,克拉克变成了一个厨师,在采购食品。 克拉克一共采购了n个食物,每个食物有一个体积vi。现在克拉克有一个容量为V背包,他想用这个背包来装尽量多的食物。请你告诉他最多能装多少食物。
输入描述
第一行一个整数T(1≤T≤10),表示数据的组数。 每组数据第一行是两个整数n,V(1≤n≤105,1≤V≤109),表示克拉克的数目和背包容量。 接下来一行有n个正数,第i个整数表示vi(1≤vi≤109)。
输出描述
每组数据输出一行一个数,表示答案。
输入样例
1 3 5 1 3 4
输出样例
2
Hint
我们可以放第1个和第3个,这样总容量为5。
初看题好像是01背包,但是注意数据大小是10^9。
再仔细看就是一个简单的排序加前缀和就可以了。
#include
#include
#include
#include
using namespace std;
const int N = 100001;
long long a[N];
int main(void)
{
int T;
int i, j;
scanf("%d", &T);
while(T--)
{
long long n, v;
scanf("%I64d%I64d", &n, &v);
for(i = 0; i < n; i++) scanf("%I64d", &a[i]);
sort(a, a+n);
long long tmp = 0;
for(i = 0; i < n && tmp <= v; i++)
{
tmp += a[i];
}
if(tmp <= v) printf("%d\n", i);
else printf("%d\n", i-1);
}
return 0;
}