#include <iostream>
#include <algorithm>
using namespace std;
//dp[item][time] = value
int dp[105][2000];
int herdTime[105]; //采草药的时间
int herdValue[105]; //采草药的价值
int main() {
int T, M;
while (scanf("%d%d", &T, &M) != EOF) { // 注意 while 处理多个 case
//由于后面的dp[0][0] 是为0的,所以从1开始方便编程
for(int i = 1; i <= M; i++){
scanf("%d%d", &herdTime[i], &herdValue[i]);
}
for(int item = 0; item <= M; item++){
for(int time = 0; time <= T; time++){
if(0 == item || 0 == time){
dp[item][time] = 0;
continue;
}
if(time - herdTime[item] < 0){ //时间不够采摘,就不采摘了,拿上一次的结果
dp[item][time] = dp[item - 1][time];
}else{ //时间够采摘,就看看到底要不要采,把 采摘的情况 和 不采摘的情况取一个最大值
dp[item][time] = max(dp[item - 1][time], herdValue[item] + dp[item - 1][time - herdTime[item]]);
}
}
}
printf("%d\n", dp[M][T]);
}
}
// 64 位输出请用 printf("%lld")
我觉得这里dp的意思是dp[i][j] 目前可以选的种类是0 - i, 此时的空间还有 j

京公网安备 11010502036488号