• 采药


    https://www.nowcoder.com/practice/d7c03b114f0541dd8e32ce9987326c16?tpId=61&&tqId=29547&rp=1&ru=/activity/oj&qru=/ta/pku-kaoyan/question-rankinghttps://www.nowcoder.com/practice/d7c03b114f0541dd8e32ce9987326c16?tpId=61&&tqId=29547&rp=1&ru=/activity/oj&qru=/ta/pku-kaoyan/question-ranking

    时间限制:1秒空间限制:65536K热度指数:863
    算法知识视频讲解

    题目描述

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

    输入描述:

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

    输出描述:

    可能有多组测试数据,对于每组数据,
    输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。
    示例1

    输入

    70 3
    71 100
    69 1
    1 2
    

    输出

    3
    

    dp的题,代码很简单,理解起来难

    #include<stdio.h>
    int s[1050];
    int main()
    {
        int t,n,w,v,i,j;
     	while(scanf("%d%d",&t,&n)!=EOF)
     	{	
    	for(i=1;i<=n;++i)
    	 {
    	    scanf("%d%d",&w,&v);
    	    for(j=t;j>=w;j--)
    	    if(s[j-w]+v>s[j])
    	    s[j]=s[j-w]+v;
    	 }
    	 printf("%d
    ",s[t]);
    	}
     	return 0;
    }
    

    另一种AC代码

    #include<stdio.h>
    #define N 1020
    int dp[N][N];
    int max(int a,int b)
    {
    	if(a>b)
    		return a;
    	return b;
    }
    int main()
    {
    	int T,M,t,v,i,j;
    	
    	scanf("%d%d",&T,&M);
    	for(i=1;i<=M;i++)
    	{
    		scanf("%d%d",&t,&v);
    		for(j=1;j<t;j++)
    		dp[i][j]=dp[i-1][j];
    		for(j=T;j>=t;j--)
    		dp[i][j]=max(dp[i-1][j],dp[i-1][j-t]+v);
    	}
    	printf("%d
    ",dp[M][T]);
    	return 0;
    }

  • 相关阅读:
    修改RedHat7的root用户密码
    Linux目录,rpm及top,vi命令简记
    Centos7或RedHat7下安装Mysql
    异常、线程
    File类
    JDBC的学习(一)
    MySql多表查询_事务_DCL(资料三)
    MySql约束_设计_备份还原(资料二)
    MySql基础_DDL_DML_DQL(资料一)
    算法小结(一)
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/10003084.html
Copyright © 2020-2023  润新知