动态规划
专题洛谷 P1048 采药
题目描述
输入输出格式
说明
对于 30% 的数据,M ≤ 10;
对于全部的数据,M ≤ 100。
NOIP 2005 普及组第三题
时空限制
- 时间:1000ms
- 空间:128MB
思路
最基础的 01背包
问题,可以找到做 DP 问题的信心!:)
递推关系
dp[j] = max(dp[j], dp[j-good[i].t]+good[i].w); //当药草时间不超过总时间,取不采这株药草和采这株药草的最大值
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[10000];
struct goods{
int t,w;
}good[10000];
int main(){
memset(dp,0,sizeof(dp));
int T,m;
scanf("%d%d",&T,&m);
for(int i = 1; i <= m; ++i){
scanf("%d%d",&good[i].t,&good[i].w);
}
for(int i = 1; i <= m; ++i){
for(int j = T; j >= 0; --j){
if(j >= good[i].t){ //药草时间不超过总时间
dp[j] = max(dp[j], dp[j-good[i].t]+good[i].w);
}
//if(j >= good[i].t)
}
}
printf("%d",dp[T]); //注意是T,不是m
return 0;
}