动态规划
专题洛谷 P1616 疯狂的采药
题目背景
题目描述
输入输出格式
说明
时空限制
- 时间:1000ms
- 空间:128MB
思路
这是一道 完全背包
问题,大致模板和 01背包
是一样的, 递推关系也和 P1048 是一致的,不过也有需要注意的地方。
- 完全背包的第二重循环是顺序而非逆序。
- 最后输出的也不是 dp[T] ,而是要格外进行一次循环判断,再取 max 值。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[100010];
struct goods{
int t,w;
}good[10010];
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 = good[i].t; j <= T; ++j){ //完全背包:顺序
//if(j >= good[i].t){ //药草时间不超过总时间
dp[j] = max(dp[j], dp[j-good[i].t]+good[i].w);
//}
}
}
int result = 0;
for(int i = 1; i <= T; ++i){
result = max(dp[i], result);
}
printf("%d",result); //注意是result
return 0;
}