• 【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;	
    }


  • 相关阅读:
    样式表练习
    表单的制作
    PHP课后感
    eclipse中项目改名
    Windows下关闭占用指定端口应用程序的方法
    ftp上传不成功,提示501 invalid character in command错误
    分割字符串取最后一部分
    toString()方法之使用
    访问FTP服务器方法
    eclipse中svn检出项目,项目名上带有红色感叹号
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632387.html
Copyright © 2020-2023  润新知