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; }