戏子多秋694 2024-10-31 17:22 采纳率: 33.3%
浏览 7
已结题

各位看看我代码哪错了

img

img

这是一个贪心算法的题,我觉得没什么问题但交oj上就是编译错误

  • 写回答

1条回答 默认 最新

  • Cin.白术 2024-10-31 17:43
    关注

    哪有代码?而且事实上这也不是贪心算法
    (参考样例:100 3 / 70 100 / 50 60 / 50 60 ,此时如果贪心会优先选择70 100,反而不如选择其他两个)
    如果说按照比例贪心(价值/时间),则参考样例 100 2 / 50 100 / 100 150,按照比例会优先选择50 100,反而不如100 150
    因此应考虑动态规划算法,代码如下:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int maxHerbValue(int timeLimit, vector<pair<int, int>> &herbs) {
        int n = herbs.size();
        vector<vector<int>> dp(n + 1, vector<int>(timeLimit + 1, 0));
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= timeLimit; ++j) {
                if (herbs[i - 1].first > j) { // If current herb cannot fit into the remaining time
                    dp[i][j] = dp[i - 1][j];
                } else { 
                    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - herbs[i - 1].first] + herbs[i - 1].second);
                }
            }
        }
    
        return dp[n][timeLimit]; 
    }
    
    int main() {
        int t, m;
        cin >> t >> m;
        vector<pair<int, int>> herbs(m);
    
        for (int i = 0; i < m; ++i) {
            cin >> herbs[i].first >> herbs[i].second;
        }
    
        cout << maxHerbValue(t, herbs) << endl;
    
        return 0;
    }
    

    其中herbs[i-1]记录第i株草药的时间和价值,dp记录的是前i株草药,在花费时间不超过j时的最大价值

    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - herbs[i - 1].first] + herbs[i - 1].second);

    意为前i株花费时间j时,如果不采集第i株,则和前i-1株花费时间j的收益相同;如果采集i,则前i-1最多花费的时间不能超过j-time[i-1](time在这里被记在herbs.first中),因为要为采集i留出时间,那么前i-1株的最大收益为dp[i-1][j-herbs[i-1].first],第i株收益为herbs[i-1].second,二者相加即为采集i时的最大收益。
    dp[i][j]即为上述二者的最大值。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月8日
  • 已采纳回答 10月31日
  • 修改了问题 10月31日
  • 创建了问题 10月31日