Happy Programming Contest
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4995
0-1背包,按照时间排序保证总时间最小。以后写if-else注意多continue,还有0-1背包不需要多加一维。
以后注意。
View Code
const int MM = 1111; #define debug puts("wrong") //typedef __int64 int64; int N,M; int dp[MM][4]; struct Info{int t,v;}g[MM]; bool cmp(Info x,Info y) {return x.t==y.t?x.v<y.v:x.t<y.t;} /* 100 10 5 2 4 6 8 10 2 4 6 8 10 */ void get_data() { int i,j,k; scanf("%d%d",&M,&N); for(i=1;i<=N;i++) scanf("%d",&g[i].t); for(i=1;i<=N;i++) scanf("%d",&g[i].v); sort(g+1,g+N+1,cmp); } void solve() { int i,j,k,tmp,t1,tt; memset(dp,0,sizeof(dp)); for(i=1;i<=N;i++) { for(j=M;j>=g[i].t;j--) { tmp=dp[j-g[i].t][0]+g[i].v; if(tmp>dp[j][0]) { dp[j][0]=tmp; dp[j][1]=dp[j-g[i].t][1]+1; dp[j][2]=dp[j-g[i].t][2]+j; continue; } else if(tmp==dp[j][0]) { tt=dp[j-g[i].t][1]+1; if(tt>dp[j][1]) { dp[j][1]=tt; dp[j][2]=dp[j-g[i].t][2]+j; continue; } else if(tt==dp[j][1]) { t1=dp[j-g[i].t][2]+j; dp[j][2]=f_min(t1,dp[j][2]); continue; } } // printf("%d %d %d %d %d\n",i,j,dp[j][0],dp[j][1],dp[j][2]); } } int a1=-1,a2=-1,a3=-1; for(i=0;i<=M;i++) { if(a1==-1||dp[i][0]>a1) { a1=dp[i][0], a2=dp[i][1], a3=dp[i][2]; continue; } if(dp[i][0]==a1) { if(a2==-1||a2<dp[i][1]) { a2=dp[i][1], a3=dp[i][2]; continue; } if(a2==dp[i][1]) { if(a3==-1||a3>dp[i][2]) a3=dp[i][2]; } } } printf("%d %d %d\n",a1,a2,a3); } int main() { int ca; scanf("%d",&ca); while(ca--) get_data(),solve(); return 0; }