原题链接:找啊找啊找GF
解题思路:
注意事项:
参考代码:
#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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复