CSUOJ1630 -- Plane Ticket Pricing
Similar to a backpack, but the last item can be split. In addition, because the first choice is required, dp is performed from the back.
The Code is as follows:
# Include
# Include
# Include
Using namespace std; # define INF 0x3f3f3ftypedef struct {int cnt; int w [103], v [103];} P; P p [55]; int dp [55] [550]; int main () {// freopen ("in.txt", "r", stdin); int n, m; while (scanf ("% d", & n, & m )! = EOF) {m ++; memset (dp, 0, sizeof (dp); for (int I = m; I> = 1; I --) {scanf ("% d", & p [I]. cnt); for (int j = 0; j
= 0; j --) {for (int k = 0; k
= 0 & dp [I-1] [j-p [I]. v [k]! =-1) {dp [I] [j] = max (dp [I] [j], dp [I-1] [j-p [I]. v [k] + p [I]. w [k] * p [I]. v [k]);} if (j = p [I]. v [k]) // you can sell multiple tickets for (int d = p [I]. v [k]-1; d> = 0; d --) if (dp [I-1] [0]! =-1) dp [I] [d] = max (dp [I] [d], dp [I-1] [0] + d * p [I]. w [k]) ;}}int sum = 0; for (int I = 0; I <= n; I ++) sum = max (dp [m] [I], sum); if (m = 1) /// in case of m = 1, we need to determine {printf ("% d \ n", sum); for (int I = 0; I