Clarke and food
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 501 Accepted Submission(s): 292
Problem Description
Clarke is a patient with multiple personality disorder. One day, Clarke turned into a cook, was shopping for food.
Clarke has bought n food. The volume of the i th food is vi . Now Clarke has a pack with volume V . He wants to carry food as much as possible. Tell him the maxmium number he can brought with this pack.
Clarke has bought n food. The volume of the i th food is vi . Now Clarke has a pack with volume V . He wants to carry food as much as possible. Tell him the maxmium number he can brought with this pack.
Input
The first line contains an integer
T(1≤T≤10)
, the number of the test cases.
For each test case:
The first line contains two integers n,V(1≤n≤105,1≤V≤109) .
The second line contains n integers, the i th integer denotes vi(1≤vi≤109) .
For each test case:
The first line contains two integers n,V(1≤n≤105,1≤V≤109) .
The second line contains n integers, the i th integer denotes vi(1≤vi≤109) .
Output
For each test case, print a line with an integer which denotes the answer.
Sample Input
1 3 5 1 3 4
Sample Output
2 Hint: We can carry 1 and 3, the total volume of them is 5.
题目链接:点击打开链接
脑洞题, 本以为是背包, 读入数据后排序, 从小到大一直拿, 拿到不能拿为止可以使装食物数量最大.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "utility"
#include "map"
#include "set"
#include "vector"
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5;
int n, v, a[MAXN];
int main(int argc, char const *argv[])
{
int t;
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &v);
for(int i = 0; i < n; ++i)
scanf("%d", &a[i]);
sort(a, a + n);
int sum = 0, ans = 0;
for(int i = 0; i < n; ++i) {
sum += a[i];
if(sum <= v) ans++;
else break;
}
printf("%d\n", ans);
}
return 0;
}

解决一个关于背包问题的变种,即如何最大化利用背包体积来装载不同大小的食物。通过排序和遍历策略找到能装下的最多食物数量。
1037

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



