# 算法母题
# 0-1背包模型
// 入参是物品的个数和背包的容量上限,以及物品的重量和价值数组
function knapsack(n, c, w, value) {
// dp是动态规划的状态保存数组
const dp = (new Array(c+1)).fill(0)
// res 用来记录所有组合方案中的最大值
let res = -Infinity
for(let i=1;i<=n;i++) {
for(let v=c;v>=w[i];v--) {
// 写出状态转移方程
dp[v] = Math.max(dp[v], dp[v-w[i]] + value[i])
// 即时更新最大值
if(dp[v] > res) {
res = dp[v]
}
}
}
return res
}
# 换硬币
var coinChange = function(coins, amount) {
let dp = new Array(amount+1).fill(Infinity)
dp[0] = 0
for (let coin of coins ) {
for (let i = 1; i <= amount; i++) {
if (i - coin >= 0) {
dp[i] = Math.min(dp[i], dp[i - coin] + 1)
}
}
}
return dp[amount] === Infinity ? 'Impossible' : dp[amount]
}
# 最小路径和
var minPathSum = function (grid) {
const m = grid.length,
n = grid[0].length
for (let i = m - 1; i >= 0; i--) {
for (let j = n - 1; j >= 0; j--) {
if (i + 1 < m && j + 1 < n) {
grid[i][j] += Math.min(grid[i + 1][j], grid[i][j + 1])
} else if (i + 1 < m) {
grid[i][j] += grid[i + 1][j]
} else if (j + 1 < n) {
grid[i][j] += grid[i][j + 1]
}
}
}
return grid[0][0]
};
# 点菜问题
var line;
while(line = readline()){
line = line.split(" ");
var count = parseInt(line[0]), //总额度
nlen = parseInt(line[1]), //菜的数量
priceArr = [], //菜的价格
evaArr = []; //菜的评价
for(let i = 0; i < nlen; i++){
line = readline().split(" ");
priceArr.push(parseInt(line[0]));
evaArr.push(parseInt(line[1]));
}
var maxEva = 0,
prices = new Array(count + 1);
prices.fill(0);
for(let i = 0; i < nlen; i++){
let price = priceArr[i],
eva = evaArr[i];
for(let j = count; j >= price; j--){
prices[j] = Math.max(prices[j], prices[j - price] + eva);
if(prices[j] > maxEva){
maxEva = prices[j];
}
}
}
print(maxEva);
}