背包问题?什么牛马?还是贪心?em求此题的代码,各位大奆帮帮忙
2条回答 默认 最新
- 技术专家团-小桥流水 2022-07-15 16:19关注
运行结果及代码如下:
例1:例2:
代码:
#include <iostream> using namespace std; //1判断在n天内,是否有所有考试科目 int isContainAll(int m, int* d, int t) { for (int i = 1; i <= m; i++) { int j = 0; for (; j < t; j++) { if (d[j] == i) break; } if (j >= t) //t天内没有i科目的考试,不满足要求 return 0; } return 1; } //2在t天内,如果出现多次i科目的考试,只保留最后1次的天数 void deald(int* d, int t, int m) { for (int i = t - 1; i >= 0; i--) { if (d[i] == 0) continue; //如果d[i]不为0,将之前的=d[i]的全部置0 for (int j = 0; j < i; j++) { if (d[j] == d[i]) d[j] = 0; } } } //获取数组中从start开始不为0的元素的第一个位置 int getpos(int* d, int t,int start) { for (int i = start; i < t; i++) { if (d[i] != 0) return i; } return 0; } //3判断在t天内,是否能够保证所有的科目都能完全准备完 int isFull(int* d,int t, int m, int* p) { int shift = 0; int start = 0; for (int i = 0; i < m; i++) { int pos = getpos(d, t, start); //判断是否有足够的天数复习 if (pos - start + shift < p[d[pos]]) return 0; else { shift = pos - start + shift - p[d[pos]]; start = pos + 1; } } return 1; } int main() { int n, m; int* d, * p; int sum = 0; //所有科目一共需要准备的天数 cin >> n >> m; //输入n和m d = new int[n]; p = new int[m]; //输入di for (int i = 0; i < n; i++) cin >> d[i]; //输入mi for (int i = 0; i < m; i++) { cin >> p[i]; sum += p[i]; } //需要的天数至少为sum + m ,sum天准备,m天考试 int t = sum + m; for (; t <= n; t++) { //从t-1到0,判断是否包含了所有的科目 if (isContainAll(m, d, t)) { deald(d, t, m); //处理d if (isFull(d, t, m, p)) { cout << t; return 0; } } } cout << "-1"; return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 cplex运行后参数报错是为什么
- ¥15 之前不小心删了pycharm的文件,后面重新安装之后软件打不开了
- ¥15 vue3获取动态宽度,刷新后动态宽度值为0
- ¥15 升腾威讯云桌面V2.0.0摄像头问题
- ¥15 关于Python的会计设计
- ¥15 聚类分析 设计k-均值算法分类器,对一组二维模式向量进行分类。
- ¥15 stm32c8t6工程,使用hal库
- ¥15 找能接spark如图片的,可议价
- ¥15 关于#单片机#的问题,请各位专家解答!
- ¥15 博通raid 的写入速度很高也很低