您的位置:首页 > 其它

竞赛得分

2017-12-14 17:11 148 查看

题目

Description

学生在我们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

解题思路

这是一道完全背包问题,可以用一维数组来做。

代码

#include<cstdio>
using namespace std;
const int maxm=10001,maxn=10001;
int m,n,w[maxn],c[maxn],f[maxm];
int main()
{
scanf("%d%d",&m,&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&c[i],&w[i]);
for (int i=1;i<=n;i++)
for (int v=w[i];v<=m;v++)//f[v]表示不超过时间值v的最大价值
if (f[v-w[i]]+c[i]>f[v]) f[v]=f[v-w[i]]+c[i];
printf("%d",f[m]);//f[m]为最优解
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划
相关文章推荐