题目背景

学生在我们USACO的竞赛中的得分越多我们越高兴。

我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助

题目描述

我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大。输入包括竞赛的时间,M(1 <= M <= 10,000)(不要担心,你要到了训练营中才会有长时间的比赛)和N,"种类"的数目1 <= N <= 10,000。后面的每一行将包括两个整数来描述一个"种类":

第一个整数说明解决这种题目能得的分数(1 <= points <= 10000),第二整数说明解决这种题目所需的时间(1 <= minutes <= 10000)。

你的程序应该确定我们应该从每个"种类"中选多少道题目使得能在竞赛的时间中得到最大的分数。

来自任意的"种类"的题目数目可能是任何非负数(0或更多)。

计算可能得到的最大分数。

输入输出格式

输入格式:

第 1 行: M, N--竞赛的时间和题目"种类"的数目。

第 2-N+1 行: 两个整数:每个"种类"题目的分数和耗时。

输出格式:

单独的一行包括那个在给定的限制里可能得到的最大的分数。

输入输出样例

输入样例#1:

300 4
100 60
250 120
120 100
35 20
输出样例#1:

605

说明

题目翻译来自NOCOW。

USACO Training Section 3.1

思路:

  多重背包;

来,上代码:

#include <cstdio>
#include <iostream> using namespace std; int if_z,m,n,dp[]; char Cget; inline void in(int &now)
{
now=,if_z=,Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
} int main()
{
in(m),in(n);int vi,ci;
while(n--)
{
in(ci),in(vi);
for(int i=vi;i<=m;i++) dp[i]=max(dp[i],dp[i-vi]+ci);
}
cout<<dp[m];
return ;
}

最新文章

  1. Ninject之旅之七:Ninject依赖注入
  2. CSS3 Animation
  3. C++二级指针第三种内存模型
  4. php像新浪微博一样生成短域名
  5. Maven如何手动添加依赖的jar文件到本地Maven仓库
  6. DataTable.Select
  7. idea自动生成serialVersionUID
  8. Cocos2d-x 3.0心得(01)-图片载入与混合模式
  9. linux上TCP connection timeout的原因查找
  10. 高性能IO设计模式之阻塞/非阻塞,同步/异步解析
  11. Android testing tools
  12. C#语言基础之数据类型
  13. 【EntityFramework 6.1.3】个人理解与问题记录(3)
  14. 1.php开发环境安装
  15. 【重磅】FineUIPro基础版免费,是时候和ExtJS说再见了!
  16. 不停机修改线上 MySQL 主键字段 以及其带来的问题和总结思考
  17. MySQL 学习资料
  18. 【Linux】DNS服务-BIND从服务器、缓存服务器及转发服务器配置(三)
  19. 字典构造、合并(dict)、排序
  20. 非常粗糙的react网页ppt

热门文章

  1. MySQL8.0.12安装及配置
  2. shell 练习题 - 第三周
  3. ubuntu18.04+win10解决时钟不同步办法
  4. Lecture 3
  5. python计算机基础(三)
  6. LeetCode(228) Summary Ranges
  7. 欧拉函数:HDU1787-GCD Again(欧拉函数的模板)
  8. Wannafly挑战赛21 机器人
  9. poj 2251 三维地图最短路径问题 bfs算法
  10. MIP启发式算法:遗传算法 (Genetic algorithm)