思路
这个和 点菜问题 一样,也是 0-1 背包问题,这里就不进行赘述了,用 dp[i][j] 表示限时 j 采前 i 种药的最大总价值,那最后求出来 dp[M][T] 就好了
- 不采第 i 种药:
- 采第 i 种药:
因为前面已经说过如果进行空间复杂度的优化,这里我就直接写出优化后的版本了。
#include<iostream>
#include<vector>
using namespace std;
int main(){
int T, M;
while(cin >> T >> M){
vector<pair<int, int>> herbs;
int time, value;
for(int i = 0; i < M; i ++){
cin >> time >> value;
herbs.emplace_back(time, value);
}
vector<int> dp(T + 1, 0);
for(int i = 0; i < M; i ++){
for(int j = T; j >= herbs[i].first; j --)
dp[j] = max(dp[j], dp[j - herbs[i].first] + herbs[i].second);
}
cout << dp[T] << endl;
}
return 0;
} 
京公网安备 11010502036488号