zoukankan      html  css  js  c++  java
  • 疯狂的采药(完全背包)

    题目描述

    LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同种类的草药,采每一种都需要一些时间,每一种也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

    如果你是LiYuxiang,你能完成这个任务吗?

    此题和原题的不同点:

    1.每种草药可以无限制地疯狂采摘。

    2.药的种类眼花缭乱,采药时间好长好长啊!师傅等得菊花都谢了!

    输入输出格式

    输入格式:

    输入第一行有两个整数T(1 <= T <= 100000)和M(1 <= M <= 10000),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到10000之间(包括1和10000)的整数,分别表示采摘某种草药的时间和这种草药的价值。

    输出格式:

    输出一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。

    输入输出样例

    输入样例#1: 复制

    70 3
    71 100
    69 1
    1 2
    

    输出样例#1: 复制

    140
    

    说明

    对于30%的数据,M <= 1000;

    对于全部的数据,M <= 10000,且M*T<10000000(别数了,7个0)。

    加油LiYuxiang,第一个AC留给你!

    完全背包

    代码:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #include<set>
    #include<map>
    #include<vector>
    #include<cmath>
    
    const int maxn=1e5+5;
    typedef long long ll;
    using namespace std;
    int a[10005],b[10005];
    int dp[maxn];
    int main()
    {
    	int T,m;
    	cin>>T>>m;
    	for(int t=1;t<=m;t++)
    	{
    	   scanf("%d%d",&a[t],&b[t]);
    	}
    	for(int t=1;t<=m;t++)
    	{
    		for(int j=0;j<=T;j++)
    		{
    		if(j<a[t])
    		{
    			dp[j]=dp[j];
    		}
    		else
    		{
    			dp[j]=max(dp[j],dp[j-a[t]]+b[t]);
    		}
    		}
    	}
    	cout<<dp[T]<<endl;
    	return 0;
    } 
  • 相关阅读:
    GitHub统计
    不错的第三方控件
    仿射变换(CGAffineTransform)使用小结
    AffineTransform(仿射变换)
    使用CAShapeLayer实现复杂的View的遮罩效果
    使用CAShapeLayer实现一个音量大小动态改变的控件
    window10 Docker仓库访问
    postgresql从timestamp(6)复制到timestamp(0),时间会变
    在编译Dll文件的时候遇到dll 链接不一致的问题
    qtquery 取列的值
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781781.html
Copyright © 2011-2022 走看看