http://acm.hust.edu.cn/vjudge/contest/view.action?cid=23407#problem/H
// File Name: h.cpp
// Author: bo_jwolf
// Created Time: Tuesday, May 07, 2013 PM02:34:40 HKT
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct node
{
int key,time,cnt;
int ty;
}dp[1100][1100];
struct node1
{
int w,key;
}g[1100];
int t,n;
int cmp(node1 t,node1 t1)
{
return t.w < t1.w;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&t,&n);
for(int i=1;i<=n;i++)
scanf("%d",&g[i].w);
for(int i=1;i<=n;i++)
scanf("%d",&g[i].key);
sort(g+1,g+1+n,cmp);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=0;j<=t;j++)
{
dp[i][j] = dp[i-1][j];
//dp[i][j].ty=j;
if(j<g[i].w) continue;
int flag=0;
int tkey,tcnt,time;
tkey = dp[i-1][ j-g[i].w ].key + g[i].key;
tcnt = dp[i-1][ j-g[i].w ].cnt+1;
if( tkey < dp[i][j].key) continue;
if( tkey>dp[i][j].key )
{
dp[i][j].cnt=tcnt;
dp[i][j].key=tkey;
dp[i][j].ty=j-g[i].w;
dp[i][j].time=dp[i-1][j-g[i].w].time+j;
continue;
} // 如果解题数都相同的话
if(tcnt < dp[i][j].cnt) continue;
if(tcnt>dp[i][j].cnt)
{
dp[i][j].cnt=tcnt;
dp[i][j].ty=j-g[i].w;
dp[i][j].time=dp[i-1][j-g[i].w].time+j;
continue;
}
}
}
int mx=0,mxcnt=0,mxi=0;
for(int i=0;i<=t;i++)
{
if(dp[n][i].key<mx) continue;
if(dp[n][i].key > mx)
{
mx=dp[n][i].key;
mxcnt=dp[n][i].cnt;
mxi=dp[n][i].time;
continue;
}
if(dp[n][i].cnt<mxcnt) continue;
if(dp[n][i].cnt>mxcnt)
{
mxcnt=dp[n][i].cnt;
mxi=dp[n][i].time;
continue;
}
if(dp[n][i].time<mxi) mxi=dp[n][i].time;
}
printf("%d %d %d\n",mx,mxcnt,mxi);
}
return 0;
}