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)。
第一行:两个整数,竞赛的时间m和题目类型数目n。
第二~n+1行:两个整数,每种类型题目的分数和耗时。
Output
一个数据,表示在给定的固定时间里得到的最大分数。
300 4 100 6 250 60 120 100 35 20Sample 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; }