#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<queue> #include<cmath> #include<memory.h> using namespace std; struct Point { int t,v; }p[55]; bool cmp(Point left,Point right) { return left.t<right.t; } int dp[1005],pen[1005],pro[1005]; int main () { int test;scanf("%d",&test); while(test--) { int len,n; scanf("%d%d",&len,&n); memset(dp,0,sizeof(dp)); memset(pro,0,sizeof(pro)); memset(pen,0,sizeof(pen)); for(int i=1;i<=n;++i) scanf("%d",&p[i].t); for(int i=1;i<=n;++i) scanf("%d",&p[i].v); int ans_val=0,ans_p=0,penalty=0; sort(p+1,p+1+n,cmp); for(int i=1;i<=n;++i) { for(int j=len;j>=p[i].t;--j) { bool flag=false; if(dp[j-p[i].t]+p[i].v>dp[j]) flag=true; else if(dp[j-p[i].t]+p[i].v==dp[j] && pro[j-p[i].t]+1>pro[j]) flag=true; else if(dp[j-p[i].t]+p[i].v==dp[j] && pro[j-p[i].t]+1==pro[j] && pen[j-p[i].t]+j<pen[j]) flag=true; if(flag) // update { dp[j]=dp[j-p[i].t]+p[i].v; pro[j]=pro[j-p[i].t]+1; pen[j]=pen[j-p[i].t]+j; } } } for(int j=0;j<=len;++j) { bool flag=false; if(ans_val<dp[j]) flag=true; else if(ans_val==dp[j] && ans_p<pro[j]) flag=true; else if(ans_val==dp[j] && ans_p<pro[j] && penalty>pen[j]) flag=true; if(flag) { ans_val=dp[j]; ans_p=pro[j]; penalty=pen[j]a; } } printf("%d %d %d\n",ans_val,ans_p,penalty); } return 0; }