1 3 5 1 3 4
2 Hint: We can carry 1 and 3, the total volume of them is 5.
/************************************************************************/
附上该题对应的中文题
克拉克是一名人格分裂患者。某一天,克拉克变成了一个厨师,在采购食品。 克拉克一共采购了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
我们可以放第1个和第3个,这样总容量为5。
出题人的解题思路:
可以证明从小到大一直拿,拿到不能拿为止是最优的。
所以排序一下即可。
说实话,第一眼看到的时候觉得是01背包,然而,V的范围果断让我否定了这种想法#pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<stack> #include<math.h> #include<vector> #include<map> #include<set> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 using namespace std; const int N = 100005; const int M = 100005; const int inf = 100000000; const int mod = 2009; int s[N]; int main() { int t,n,V,i,k; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&V); for(k=i=0;i<n;i++) scanf("%d",&s[i]); sort(s,s+n); for(i=0;i<n;i++) if(V-s[i]>=0) { k++; V-=s[i]; } else break; printf("%d\n",k); } return 0; }菜鸟成长记