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

题目描述

学生在我们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]为所求!
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值