解题思路:

注意事项:

参考代码:

#include"bits/stdc++.h"
using namespace std;
// 定义全局变量
int n, m, r; // n表示物品MM数量,m表示有多少钱,r表示总人品
int rmb[110], rp[110], ti[110]; // rmb数组存储请每个MM吃饭要的钱,rp数组存储泡每个MM要的人品,ti数组存储搞定每个MM的时间
int dp1[110][110], dp2[110][110]; // dp1数组用于记录最大MM数量,dp2数组用于记录最小时间

int main() {
    // 输入MM数量n
    cin >> n;
    // 输入搞定每个MM的钱、人品和时间
    for (int i = 1; i <= n; i++) {
        cin >> rmb[i] >> rp[i] >> ti[i];
    }
    // 输入总金额m和总人品r
    cin >> m >> r;
    // 动态规划计算最大MM数量和最小时间
    for (int i = 1; i <= n; i++) {
        for (int j = m; j >= rmb[i]; j--) {
            for (int k = r; k >= rp[i]; k--) {
                // 如果当前组合的MM数量大于之前的组合
                if (dp1[j][k] < dp1[j - rmb[i]][k - rp[i]] + 1) {
                    // 更新最大MM数量
                    dp1[j][k] = max(dp1[j][k], dp1[j - rmb[i]][k - rp[i]] + 1);
                    // 更新最小时间
                    dp2[j][k] = max(dp2[j][k], dp2[j - rmb[i]][k - rp[i]] + ti[i]);
                }
                // 如果当前组合的MM数量等于之前的组合
                else if (dp1[j][k] == dp1[j - rmb[i]][k - rp[i]] + 1) {
                    // 更新最小时间
                    dp2[j][k] = min(dp2[j][k], dp2[j - rmb[i]][k - rp[i]] + ti[i]);
                }
            }
        }
    }
    // 输出结果:在给定总金额和总人品下,最小的时间
    cout << dp2[m][r] << endl;
    return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论