采药

采药

http://www.nowcoder.com/questionTerminal/d7c03b114f0541dd8e32ce9987326c16

思路

这个和 点菜问题 一样,也是 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;
}
算法题解 文章被收录于专栏

不定期更新一些算法题解,有什么问题可以随时留言~

全部评论

相关推荐

03-29 17:05
门头沟学院 Java
asdasdasda...:我前段时间找工作焦虑,有几天连续熬夜熬穿了,然后心脏突然不舒服,立马躺床上睡觉了,然后第二天还是不舒服,去看医生说是心率不齐,吓得我后面天天早早睡觉,调养身体,过了好几天才好过来。所以真的,工作这些东西哪有那么重要,最多钱多一点钱少一点,降低物欲。活着才是最重要的,现在想想真的后怕
如何排解工作中的焦虑
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务