您的位置:首页 > 编程语言 > C语言/C++

SSL_2292竞赛得分C++(动规练习题)

2017-12-11 21:12 232 查看
题目描述

学生在我们USACO的竞赛中的得分越多我们越高兴。我们试着设计我们的竞赛以便人们能尽可能的多得分。现在要进行一次竞赛,总时间T固定,有若干类型可选择的题目,每种类型题目可选入的数量不限,每种类型题目有一个si(解答此题所得的分数)和ti(解答此题所需的时间),现要选择若干题目,使解这些题的总时间在T以内的前提下,所得的总分最大。

输入包括竞赛的时间,M(1 <= M <= 10000)和题目类型数目N(1 <= N <= 10000)。

后面的每一行将包括两个整数来描述一种"题型":

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

Input

第 1 行: 两个整数:竞赛的时间M和题目类型数目N。 第 2-N+1 行: 两个整数:每种类型题目的分数和耗时。

Output

单独的一行,在给定固定时间里得到的最大的分数。

Sample Input


300 4

100 60

250 120

120 100

35 20


Sample Output


605

【注释】从第2种类型中选两题和第4种类型中选三题

思路

本题根据题目描述可以看出是一个完全背包问题,因为我这个题目可以无限做,也就是完全背包。分数就是它的价值,耗时也就是它的重量。

C++代码

#include<cstdio>
#define sr c=getchar()
#define input read()
#define pd (c<'0'||c>'9')
#define fk f=f*10+c-48
#define ps if (c=='-') d=-1
using namespace std;
int n,m,f[10001],w[10001],p[10001];
int max(int x,int y)
{
return x>y?x:y;
}//定义一个max函数
int read()
{
char c;int d=1,f=0;
while (sr,pd) ps; fk;
while (sr,!pd) fk;
return d*f;
}//输入快速流
void write(int x)
{
if (!x) return;
write(x/10);
putchar(x%10+48);
}//输出快速流
int main()
{
m=input;n=input;//输入不解释
for (int i=1;i<=n;i++)
{p[i]=input;w[i]=input;}//p为价值,w为重量
for (int i=1;i<=n;i++)
for (int j=w[i];j<=m;j++)
f[j]=max(f[j],f[j-w[i]]+p[i]);//要么选,要么不选
printf("%d",f[m]);//f[m]为所求!
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: