Loading
NOIP2002普及組 選數

NOIP2005 普及组 采药

Freddy posted @ 2011年10月08日 02:26 in NOIP with tags c++ NOIP 動態規劃 , 2313 阅读

【问题描述】

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

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

【输入文件】

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

【输出文件】

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

【样例输入】

70 3
71 100
69 1
1 2

【样例输出】

3

【数据规模】

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

对于全部的数据, M <= 100 。

 

【分析】

本题是经典的0/1背包问题,直接DP即可。

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef unsigned short int usint;

class medic
{
public:
	usint t; //Time
	usint v; //Value
}Med[101];
usint T,M;//T: Total Time , M: The number of the medicine.
usint F[101][1001];

void init()
{
	cin>>T>>M;
	//初始化二維表
	for (usint i=1;i<=M;i++)
		for (usint j=1;j<=T;j++)
			F[i][j]=0;
	//從文件中讀入	
	for(usint i=1;i<=M;i++)
		cin>>Med[i].t>>Med[i].v;
	//預處理動態規劃 Pre-Dynamic Programing
	for (usint i=Med[1].t;i<=T;i++)
		F[1][i]=Med[1].v;
	return;
}

void Dynamic()
{
	usint i,j;
	for (i=2;i<=M;i++)
	{
		for(j=1;j<=T;j++)
		{
			if(Med[i].t>j)
				F[i][j]=F[i-1][j];
			else
			{
				F[i][j]=( (F[i-1][j]) > (F[i-1][j-Med[i].t]+Med[i].v) ?
					  (F[i-1][j]) : (F[i-1][j-Med[i].t]+Med[i].v) );
			}
		}
	}
}

int main()
{
	freopen("medic.in","r",stdin);
	freopen("medic.out","w",stdout);
	init();
	Dynamic();
	cout<<F[M][T]<<endl;
	return 0;
}

正在连接评测机...

 

已连接到评测机

GRID 1
名称 Flitty
系统版本 1.00
备注 COGS 1号评测机 Flitty

正在编译...

编译成功

 

测试点 结果 得分 运行时间 内存使用 退出代码
1 正确 10 0.024 s 464 KB 0
2 正确 10 0.001 s 464 KB 0
3 正确 10 0.002 s 464 KB 0
4 正确 10 0.002 s 464 KB 0
5 正确 10 0.002 s 464 KB 0
6 正确 10 0.002 s 464 KB 0
7 正确 10 0.002 s 464 KB 0
8 正确 10 0.002 s 464 KB 0
9 正确 10 0.002 s 464 KB 0
10 正确 10 0.001 s 464 KB 0

运行完成

运行时间 0.041 s

平均内存使用 464 KB

测试点通过状况 AAAAAAAAAA

得分:100

恭喜你通过了全部测试点!


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter