1 条题解

  • 0
    @ 2025-2-14 21:20:42

    C++ :

    /*
    	author  :hzoi_ztx
    	title   :
    	ALG     :
    	comment :
    	[2014 10 11 test]
    */
    
    #include <cstdio>
    
    #define  maxn  220
    #define  maxm  30
    #define  maxc  999
    
    int n , m ;
    int f[maxn][maxm][maxc] = {0} ;
    bool flag[maxn][maxm][maxc] = {0} ;
    int a[maxn] = {0} , b[maxn] = {0} ;
    
    inline int F(int x) { return x+450 ; } 
    inline int max(const int a , const int b) {if (a>b) return a ;return b ;}
    
    int main() {
    	//#define READ
    	#ifdef  READ
    		freopen("candy.in" ,"r",stdin ) ;
    		freopen("candy.out","w",stdout) ;
    	#endif
    	scanf("%d%d", &n , &m ) ;
    	if (!n) {
    		printf("0\n0\n") ; return 0 ;
    	}
    	int i , j , c , t1 , t2 ;
    	for (i = 1 ; i <= n ; i ++ ) {
    		scanf("%d%d", &t1 , &t2 ) ;
    		a[i] = t1+t2 ; b[i] = t1-t2 ;	
    	}
    	flag[0][0][F(0)] = true ;
    	for (i = 0 ; i < n ; i ++ ) {
    		j = i ; if (j>m)j = m ;
    		for ( ; j >= 0 ; j -- ) {
    			for (c = F(-400) ; c <= F(400) ; c ++ ) {
    				if (flag[i][j][c]) {
    					flag[i+1][j][c] = true ;
    					flag[i+1][j+1][c+b[i+1]] = true ;
    					if (f[i][j][c] > f[i+1][j][c]) f[i+1][j][c] = f[i][j][c] ;
    					if (f[i][j][c]+a[i+1] > f[i+1][j+1][c+b[i+1]])
    						f[i+1][j+1][c+b[i+1]] = f[i][j][c]+a[i+1] ;
    				}
    			}
    		}
    	}	
    	for (c = 0 ; c <= 400 ; c ++ ) {
    		if (flag[n][m][F(c)]) {
    			if (flag[n][m][F(-c)] && f[n][m][F(-c)]>f[n][m][F(c)])
    				printf("%d\n%d\n",-c,f[n][m][F(-c)]) ;
    			printf("%d\n%d\n",c,f[n][m][F(c)]) ;
    			break ;
    		}
    		if (flag[n][m][F(-c)]) {
    			printf("%d\n%d\n",-c,f[n][m][F(-c)]) ;
    			break ; 
    		}
    	}
    	return 0 ;
    }
    
    

    Pascal :

    
    program candy(input,output);
    var
    	f:array[0..201,0..21,-500..500] of longint;
    	w:array[0..1,0..250] of longint;
    	n,m,answer,sum:longint;
    function max(aa,bb:longint):longint;
    begin
    	if aa>bb then
    		exit(aa);
    	exit(bb);
    end;{ max }
    procedure init;
    var
    	i:longint;
    begin
    	readln(n,m);
    	for i:=1 to n do
    		readln(w[0,i],w[1,i]);
    end;{ init }
    procedure main;
    var
    	i,j,k:longint;
    begin
    	for i:=0 to n do
    		for j:=0 to m do
    			for k:=-500 to 500 do
    				f[i,j,k]:=-19950714;
    	f[0,0,0]:=0;
    	for i:=1 to n do
    		for j:=0 to m do
    			for k:=-450 to 450 do
    			begin
    				if f[i-1,j,k]<>-19950714 then
    					f[i,j,k]:=max(f[i,j,k],f[i-1,j,k]);
    				if (j>=1)and(f[i-1,j-1,k-(w[0,i]-w[1,i])]<>-19950714) then
    					f[i,j,k]:=max(f[i,j,k],f[i-1,j-1,k-(w[0,i]-w[1,i])]+w[0,i]+w[1,i]);
    			end;
    	for answer:=0 to 450 do
    		if (f[n,m,answer]>0)or(f[n,m,-answer]>0) then
    			break;
    	sum:=max(f[n,m,answer],f[n,m,-answer]);
    	writeln(answer);
    	writeln(sum);
    end;{ main }
    begin
    	
    	init;
    	main;
    	
    end.
    
    • 1

    信息

    ID
    851
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者