NOIP2005 普及组 采药
【问题描述】
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难 题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段 时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
如果你是辰辰,你能完成这个任务吗?
【输入文件】
输入文件的第一行有两个整数 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
恭喜你通过了全部测试点!