Idea: Like a backpack, directly engage
#include <cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<map>#include<cmath>#include<queue>#include<cstring>#include<Set>#include<stack>#include<string>#include<ctime>#defineLL Long Long#defineU64 unsigned long Long#defineMAXN 100010#defineINF 0x3f3f3f3f#defineEPS 1e-6using namespacestd;inta[1010];BOOLvi[500010]; Vector<int>Q;Set<int>SS;voidSolveintN) {memset (vi,0,sizeof(vi)); vi[0]=true; intv,max=0; for(inti =1; I <= N; i++){ for(intj = Max; J >=0; j--)if(Vi[j]) {vi[j+a[i]]=true; } Max+=A[i]; }}intMain () {intl,n,m,ans1,ans2,sum,a1,a2; inti,j,k,t; CIN>>T; while(t--) {scanf ("%d",&N); Sum=0; for(i =1; I <= N; i++) {scanf ("%d",&A[i]); Sum+=A[i]; } solve (n); M= sum/2; for(i = m; I >=0; i--)if(Vi[i]) Break ; Ans1=i; Ans2=sum-i; K=0; Sum=0; scanf ("%d",&N); for(i =1; I <= N; i++) {scanf ("%d",&A[i]); Sum+=A[i]; } solve (n); M= sum/2; for(i = m; I >=0; i--)if(Vi[i]) Break ; A1=i; A2=sum-i; if(A2-a1 < ANS2-ANS1 | | (A2-a1==ans2-ans1&&a1+a2 >ans2+ans1)) {ans1=A1; Ans2=A2; K=1; } Sum=0; scanf ("%d",&N); for(i =1; I <= N; i++) {scanf ("%d",&A[i]); Sum+=A[i]; } solve (n); M= sum/2; for(i = m; I >=0; i--)if(Vi[i]) Break ; A1=i; A2=sum-i; if(A2-a1 < ANS2-ANS1 | | (A2-a1==ans2-ans1&&a1+a2 >ans2+ans1)) {ans1=A1; Ans2=A2; K=2; } printf ("%c%d%d\n",'A'+k,ans1,ans2); } return 0 ;}
View Code
Uvalive 6303 Smartphone Manufacturing