【9910】竞赛总分

Time Limit: 1 second
Memory Limit: 32 MB

问题描述
学生在我们USACO的竞赛中的得分越多我们越高兴。我们试着设计我们的竞赛以便人们能尽可能地多得分。
现在要进行一次竞赛,总时间t固定,有若干类型可选择的题目,每种类型题目可选入的数量不限,每种类型题目有一个si(解答此题所得的分数)和ti(解答此题所需的时间),现要选择若干题目,使解这些题的总时间在t以内的前提下,所得的总分最大。
输入包括竞赛的时间,m(1≤m≤10000)和题目类型题目n(1≤n≤10000)。
后面的每一行将包括两个整数来描述一种“题型”:第一个整数说明解决这种题目能得的分数(1≤points≤10000),第二个整数说明解决这种题目所需的时间(1≤minutes≤10000)。

Input
第一行:两个整数,竞赛的时间m和题目类型数目n。
第二~n+1行:两个整数,每种类型题目的分数和耗时。

Output
一个数据,表示在给定的固定时间里得到的最大分数。

Sample Input
300 4
100 6
250 60
120 100
35 20
Sample Output
5000 //从第2种类型中选两题和第4种类型中选三题

【题解】

这题的数据没有像说的那么大。真有那么大,估计会超时吧。

就是一个完全背包.

记住j从小到大循环就可以了。

因为是不超过最大时间t,所以可以初值都设为0;

【代码】

#include <cstdio>
#include <cstring>

int m,n,c[10010],w[10010],f[10010];

void input_data()
{
	scanf("%d%d",&m,&n);
	for (int i = 1;i <= n;i++)
		scanf("%d%d",&c[i],&w[i]); //输入信息 
}

void get_ans()
{
	memset(f,0,sizeof(f));
	for (int i = 1;i <= n;i++) //枚举n个物品 
		for (int j = w[i];j<=m;j++) //j层循环从小到大 记住那个物品的花费为1的例子就可以了 
			if (f[j] < f[j-w[i]] + c[i]) //如果可以更新就更新 
				f[j] = f[j-w[i]] + c[i];
}	

void output_ans()
{
	printf("%d",f[m]);	//最后输出最大容量不超过m的最优解。 
}

int main()
{
	//freopen("F:\\rush.txt","r",stdin);
	input_data();
	get_ans();
	output_ans();
	return 0;	
}


posted @ 2017-10-06 19:23  AWCXV  阅读(100)  评论(0编辑  收藏  举报