思路
这个和 点菜问题 一样,也是 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; }