题目描述
举办一场新生赛还需要几个签到题,Hammer 决定去寻找境外势力的帮助。经过打听,Hammer 得知 AGC 里全是签到题,于是他报名了下一场 [AtCoder Grand Contest] ,打算直接从里边搬两个题当做新生赛的签到题。在 contest 进行前,Hammer 先去了解了一下 Atcoder 的比赛规则。
一场 Atcoder 比赛会持续 T 分钟,共有 n 道题,在你 AC 第 i 题后可以得到 si 的分数。比赛以总分数来进行排名,若总分数相同则以最后一次有效 AC 时间排名,越早者排名越靠前。(实际比赛会以AC之前的错误提交来计算罚时,因为Hammer 是一个良心的出题人,所以在这里我们无需考虑罚时。)
Hammer 深知自己的水平高低,对于每道题目看一眼题目名字就知道自己 AC 这道题需要多少分钟(可以假设 Hammer 拿到了时光机器,早已提前看过了题,比赛中无需再花费时间看题)。请你计算 Hammer 如果按照能获得尽可能高排名的方式去答题,最终的得分会是多少。
输入描述:
输入第一行两个正整数 n (1≤n≤20)n\,(1 \le n\le 20)n(1≤n≤20) 和 T (1≤T≤104)T\,(1\le T\le 10^4)T(1≤T≤104) ,分别表示这场比赛的总题数以及比赛持续的时间(时间以分钟为单位)。 接下来 nnn 行每行两个正整数 si (1≤si≤103)s_i\,(1 \le s_i\le 10^3)si(1≤si≤103) 和 ti (1≤ti≤T)t_i\,(1\le t_i\le T)ti(1≤ti≤T) ,分别表示第 iii 道题的分值与 Hammer 要想 AC 第 iii 道题所需要的时间(时间以分钟为单位)。
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
输出描述:
输出一行一个整数,表示 Hammer 在取得其最高排名情况下的得分。
示例1
输入
复制
4 10 12 6 9 5 8 5 2 3
输出
复制
17
说明
Hammer 可以选择去做第 2 题与第 3 题,恰好花费 10 分钟,获得 17 分。没有得到更高得分的方法了。
解题思路
本题目是一个很常见的01背包问题,考虑背包动态规划。我们可以讲这题目数量看作物品个数,把分数看作价值,把时间看作物品和背包的体积。
代码如下
#include<stdio.h>
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int n,T;
int a[100000];
scanf("%d %d",&n,&T);
int s,t,j;
for(int i=0;i<n;i++)
{
scanf("%d %d",&s,&t);
for(j=T;j>=t;j--)
a[j]=max(a[j],(a[j-t]+s));
}
printf("%d",a[T]);
return 0;
}