33,027
社区成员




//dp[i][j]=(a,b) 表示前i个球中选j个球所需的最少盒子为a个加附加的b空间 b<=V
#include <iostream>
#include <cstring>
inline int Rint() {int x;scanf("%d%d",&x);return x;}
const int N=501,one=(1<<10),low=one-1,high=~low;
int dp[N][N],n,m,V,v[N],i,j,t,ans;
#define min(x,y) (x<y?x:y)
inline int addl(int a, int b) {
if ((a&low) + b <= V)
return a + b;
else return (a&high)+one + b;
}
int main() {
for (int cas=Rint();cas--;) {
n=Rint(),m=Rint(),V=Rint();
m=(m<<10);//(m,0)
for (i=1;i<=n;++i) v[i]=Rint();
for (i=1;i<=n;++i) {
dp[i][0]=0; //(0,0)
for (j=1;j<i;++j) {
dp[i][j]=min(dp[i-1][j],addl(dp[i-1][j-1],v[i]));
}
dp[i][i]=addl(dp[i-1][j-1],v[i]);
}
for (ans=0,i=1;i<=n;++i) if (dp[n][i]<m&&i>ans) ans=i;
printf("%d\n",ans);
}
return 0;
}