1 条题解
-
0
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
- 上传者