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;
    } 
  • 相关阅读:
    高精度
    eps取值
    QtCreator常用快捷键
    C++11 麻辣烫
    谈一些关于华为鸿蒙的看法
    Termux新手基础+进阶学习笔记(间断更新)
    分享互联网2021年最新Java面试题汇总整理-附详细答案解析
    2021年面试,整理全网初、中、高级常见Java面试题附答案
    JS中使用map
    springboot整合MongoDB4.0多数据源实现事务
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781781.html
Copyright © 2011-2022 走看看