#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> usingnamespacestd; int dp[100009], c[100009], w[100009], m[100009]; int n, M, t; voidzeropack(int cost, int weight) { for (int i = M; i >= cost; i--) dp[i] = max(dp[i - cost] + weight, dp[i]); } voidcompletepack(int cost, int weight) { for (int i = cost; i <= M; i++) dp[i] = max(dp[i - cost] + weight, dp[i]); } voidmultipack(int cost, int weight, int num) { if (num*cost >= M) { completepack(cost, weight); return; } int k = 1; while (k < num) { zeropack(k*cost, k*weight); num -= k; k *= 2; }
zeropack(cost*num, weight*num); } intmain() { while (~scanf("%d%d", &M, &n)) { for (int i = 1; i <= n; i++) { scanf("%d%d", &m[i], &c[i]); w[i] = c[i]; } memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; i++) { multipack(c[i], w[i], m[i]); } printf("%d\n", dp[M]); } return0; }