首页 > 试题广场 >

书籍价值最大化

[编程题]书籍价值最大化
  • 热度指数:108 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小阅(掌阅吉祥物)在掌阅应用上有一些阅饼,他可以使用这些阅饼兑换一些书籍。他想兑换很多书,且每本书只需要兑换一次,但由于阅饼有限不能兑换到所有书。因此他将想兑换的每本书设置了一个价值,代表读完该书带来的收益值。他想请你帮忙计算一下,所兑换的书籍价值之和最大是多少。

输入描述:
第一行输入 s 和 n,代表有 s 个阅饼和 n 本书,s 的范围是[1, 10000],n 的范围是[1, 500]。接下来 n 行的每一行有两个数 c,v,代表该书需要的阅饼数和价值,c 和 v 的范围是[1, 10000]


输出描述:
输出兑换书籍的最大价值
示例1

输入

10 2
7 12
6 14

输出

14

说明

选择第2本,需要耗费6个阅饼,带来14个价值
示例2

输入

10 5
6 8
4 10
2 4
4 5
3 5

输出

19

说明

选择第2,3,4本,需要耗费4+2+4=10个阅饼,带来10+4+5=19个价值
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
// Write your code here
let v=[]
//忘记初始化了
let c=[]
let [s,n]=(await readline()).split(' ').map(Number)
let dp=(new Array(s+1)).fill(0)

for(let i=0;i<n;i++){
let tokens=(await readline()).split(' ').map(Number)
c.push(tokens[0])
v.push(tokens[1])
}

let j;
for(let i=0;i<n;i++){
for( j=s;j>=c[i];j--){
dp[j]=Math.max(dp[j],dp[j-c[i]]+v[i])
// console.log(dp)
}
}
console.log(dp[s])
}()

发表于 2025-05-12 23:16:04 回复(0)