#include <iostream> using namespace std; int num[11]; int v[11]; int flag[100001]; int main() { int W, n; while(scanf("%d", &W) != EOF) { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d%d", &num[i], &v[i]); if(!W || !n) { printf("0/n"); continue; } memset(flag, 0, sizeof(flag)); flag[0] = true; int max = 0; for(int i = 1; i <= n; ++i) for(int j = max; j >= 0; --j) if(flag[j]) { for(int k = 0; k <= num[i]; ++k) { int temp = j+k*v[i]; if(temp > W) break; if(max < temp) max = temp; if(!flag[temp]) flag[temp] = true; } } printf("%d/n", max); } return 0; } //这是dp?叫穷举更合适 //不过我还是要记住这个方法 //below program is TLE /*#include <iostream> using namespace std; int num[11]; int v[11]; int c[11][100001]; int main() { int W, n; while(scanf("%d", &W) != EOF) { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d%d", &num[i], &v[i]); if(!W || !n) { printf("0/n"); continue; } memset(c, 0, sizeof(c)); for(int i = 1; i <= n; ++i) { for(int j = 1; j <= W; ++j) { int max = 0; for(int k = 0; k <= num[i]; ++k) if(j-k*v[i] >= 0) { if(c[i-1][j-k*v[i]]+k*v[i] > max) max = c[i-1][j-k*v[i]]+k*v[i]; } else break; c[i][j] = max; } } printf("%d/n", c[n][W]); } return 0; }*/