program main implicit none integer*8::N,A,B,W,i,j,tmp,uplimit integer*8,allocatable::D(:) integer*8,allocatable::dp(:),pdp(:) read *, N,A,B,W allocate(D(N)) allocate(dp(0:N)) read *, D dp(0) = W + D(1) dp(1) = W - A + B*1 if(B.eq.0) then print '(i0)',W-N*A return else uplimit = A/B end if do i=2,N tmp = MINVAL(dp(0:i-1)) + D(i) do j=uplimit,1,-1 dp(j) = dp(j-1) - A + B*j end do dp(0) = tmp end do print '(i0)', MINVAL(dp(0:N)) end program