#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; //北大网络实验室经常有活动需要叫外卖, //但是每次叫外卖的报销经费的总额最大为C元,有N种菜可以点, //经过长时间的点菜,网络实验室对于每种菜i都有一个量化的评价分数(表示这个菜可口程度),为Vi, //每种菜的价格为Pi, 问如何选择各种菜,使得在报销额度范围内能使点到的菜的总评价分数最大。 //注意:由于需要营养多样化,每种菜只能点一次。 //输入的第一行有两个整数C(1 <= C <= 1000)和N(1 <= N <= 100) //C代表总共能够报销的额度,N>代表能点菜的数目。 //接下来的N行每行包括两个在1到100之间(包括1和100)的的整数,分别表示菜的>价格和菜的评价分数。 //输出只包括一行,这一行只包含一个整数,表示在报销额度范围内,所点的菜得到的最大评价分数。 int main() { //C代表总共能够报销的额度,N代表能点菜的数目。 int C, N; while (scanf("%d%d", &C, &N) != EOF) { vector<int> Value; vector<int> Score; for (int i = 0; i < N; i++) { //输入 int v, s; scanf("%d %d", &v, &s); Value.push_back(v); Score.push_back(s); } //选择各种菜,使得在报销额度范围内能使点到的菜的总评价分数最大 int dp[1001][101];//额度、菜品数 //当额度为0时 for (int i = 0; i <= N; i++) { dp[0][i] = 0; } //当菜品数为0 for (int i = 0; i <= C; i++) { dp[i][0] = 0; } for (int i = 1; i <= C; i++) { for (int j = 1; j <= N; j++) { if (i - Value[j - 1] < 0) { //钱不够 dp[i][j] = dp[i][j - 1];//总分和上一个菜品总分一致 } else { //钱够 dp[i][j] = max(dp[i][j - 1], dp[i - Value[j - 1]][j - 1] + Score[j - 1]); } } } //输出只包括一行,这一行只包含一个整数,表示在报销额度范围内,所点的菜得到的最大评价分数。 printf("%d\n", dp[C][N]); } return 0; }