这两天断断续续敲完这个(放假的时候比较懒),一次成功有点小激动(●'◡'●)  不过貌似从第一次打开开始计时。。。。。

这道题目很像01背包,我将附件与它们的主件绑定(就是link起来)然后套用动态规划

ok,解决

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4.  
  5. class node {//代表主件的类
  6. public:
  7. int value;
  8. int p;//重要度
  9. int n;//附件个数
  10. int q;//附件指向的主件编号
  11. node *link;
  12. node():value(0),p(0),n(0),q(0),link(nullptr){}
  13. };
  14.  
  15. int judge(vector<node*>& vc,int N,int m);
  16. int max(int, int);
  17.  
  18. int main()
  19. {
  20. int N, m;
  21. vector<node*> vc;
  22. cin >> N >> m;
  23. for (int i = 0;i < m;i++) {
  24. int vi, pi, qi;
  25. cin >> vi >> pi >> qi;
  26. node *np = new node();
  27. np->value = vi;
  28. np->p = pi;
  29. np->q = qi;
  30. vc.push_back(np);
  31. }
  32. for (vector<node*>::iterator i = vc.begin();i != vc.end();i++) {
  33. int tmp = (*i)->q;
  34. if (tmp > 0) {
  35. if(vc[tmp-1]->link==nullptr)
  36. vc[tmp - 1]->link = *i;
  37. else
  38. vc[tmp - 1]->link->link = *i;
  39. vc[tmp - 1]->n++;
  40. }
  41.  
  42. }
  43. for (vector<node*>::iterator i = vc.begin();i != vc.end();) {
  44. int tmp = (*i)->q;
  45. if (tmp > 0) {
  46. i=vc.erase(i);
  47. }
  48. else {
  49. ++i;
  50. }
  51.  
  52. }
  53. cout<<judge(vc, N, m)<<endl;
  54. return 0;
  55. }
  56. int judge(vector<node*>& vc, int N, int m) {
  57. //任务 返回经过计算的结果
  58. //建立一个int[3200][60]数组 因为N为10的倍数
  59. int tb[3200][60] = {0};
  60. vector<node*>::iterator ib = vc.begin();
  61. for (int i = 1;i <= N / 10;i++) {
  62. if ((*ib)->n == 0) {
  63. if ((*ib)->value <= i*10) {
  64. tb[i][1] = ((*ib)->value*(*ib)->p);
  65. }
  66. }
  67. if ((*ib)->n == 1) {
  68. if (((*ib)->value+(*ib)->link->value) <= i*10) {
  69. tb[i][1] = ((*ib)->value*(*ib)->p)+ ((*ib)->link->value*(*ib)->link->p);
  70. }
  71. else {
  72. tb[i][1] = ((*ib)->value*(*ib)->p);
  73. }
  74. }
  75. if ((*ib)->n == 2) {
  76. if (((*ib)->value + (*ib)->link->value+ (*ib)->link->link->value) <= i*10) {
  77. tb[i][1] = ((*ib)->value*(*ib)->p) + ((*ib)->link->value*(*ib)->link->p)+ ((*ib)->link->link->value*(*ib)->link->link->p);
  78. }
  79. else if (((*ib)->value + (*ib)->link->value) <= i*10) {
  80. tb[i][1] = ((*ib)->value*(*ib)->p) + ((*ib)->link->value*(*ib)->link->p);
  81. }
  82. else {
  83. tb[i][1] = ((*ib)->value*(*ib)->p);
  84. }
  85. }
  86. }
  87. ++ib;//使迭代器指向下一个元素
  88. int j=1;
  89. for (;ib != vc.end();ib++,j++) {
  90. for (int i = 1;i <= N / 10;i++) {
  91.  
  92. if ((*ib)->n == 0) {//没有附件
  93. int tmp1 = (*ib)->value;
  94. int tmp1_ = (*ib)->p;
  95. if (tmp1 > i * 10) {
  96. tb[i][j] = tb[i][j - 1];
  97. }
  98. else {
  99. tb[i][j] = max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
  100. }
  101. }
  102.  
  103. if ((*ib)->n == 1) {//有一个附件
  104. int tmp1 = (*ib)->value;
  105. int tmp1_ = (*ib)->p;
  106. int tmp2 = (*ib)->link->value;
  107. int tmp2_ = (*ib)->link->p;
  108.  
  109. if (tmp1 > i * 10) {
  110. tb[i][j] = tb[i][j - 1];
  111. }
  112. else if ((tmp1 + tmp2) > i * 10) {
  113. tb[i][j] = max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
  114. }
  115. else {
  116. int m1= max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
  117. tb[i][j] = max(m1, tb[i - (tmp1+tmp2) / 10][j - 1] + tmp1*tmp1_+tmp2*tmp2_);
  118. }
  119. }
  120.  
  121. if ((*ib)->n == 1) {//有两个附件
  122. int tmp1 = (*ib)->value;
  123. int tmp1_ = (*ib)->p;
  124. int tmp2 = (*ib)->link->value;
  125. int tmp2_ = (*ib)->link->p;
  126. int tmp3= (*ib)->link->link->value;
  127. int tmp3_ = (*ib)->link->link->p;
  128. if (tmp1 > i * 10) {
  129. tb[i][j] = tb[i][j - 1];
  130. }
  131. else if ((tmp1 + tmp2) > i * 10) {
  132. tb[i][j] = max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
  133. }
  134. else if((tmp1+tmp2+tmp3)>i*10){
  135. int m1 = max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
  136. tb[i][j] = max(m1, tb[i - (tmp1 + tmp2) / 10][j - 1] + tmp1*tmp1_ + tmp2*tmp2_);
  137. }
  138. else {
  139. int m1 = max(tb[i][j - 1], tb[i - tmp1 / 10][j - 1] + tmp1*tmp1_);
  140. int m2= max(m1, tb[i - (tmp1 + tmp2) / 10][j - 1] + tmp1*tmp1_ + tmp2*tmp2_);
  141. tb[i][j] = max(m2, tb[i - (tmp1 + tmp2 + tmp3) / 10][j - 1] + tmp1*tmp1_ + tmp2*tmp2_ + tmp3*tmp3_);
  142. }
  143. }
  144.  
  145. }
  146. }
  147. return tb[N/10][j-1];
  148.  
  149. }
  150.  
  151. int max(int a, int b) {
  152. if (a > b)
  153. return a;
  154. else
  155. return b;
  156. }

华为oj 购物单的更多相关文章

  1. 华为OJ:火车进站

    火车进站 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号. 输入描述: 有多组测试用例, ...

  2. 在华为oj的两个月

    一次偶然的机会,我接触到华为oj平台(http://career-oj.huawei.com/exam/camLogin.jsp),当时的心情很是兴奋,于是立马注册开通,然后迫不及待地上去做题.刚开始 ...

  3. 蓝桥杯 购物单(使用word协助)

    标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折 ...

  4. 2017第八届蓝桥杯C/C++ B组省赛-购物单

    标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折 ...

  5. 购物单:Excel的应用

    题目描述: 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠 ...

  6. 购物单 && 动态规划 && 背包问题

    题目叙述的言语倒是蛮多的: 王强今天很开心,公司发给N元的年终奖.王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: 主件 附件 电脑 ...

  7. 2017蓝桥杯购物单(C++B组)

    原题: 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞.这不,XX大促销又来了!老板夫人开出了长长的购物单,都是 ...

  8. Java实现第八届蓝桥杯购物单

    购物单 题目描述 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打 ...

  9. Java蓝桥杯01——第一题集锦:堆煤球、购物单、哪天返回、第几天、分数

    堆煤球(2016JavaB) 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100 ...

随机推荐

  1. CentOS7 NTP 安装配置

    NTP 网络时间协议用来同步网络上不同主机的系统时间.你管理的所有主机都可以和一个指定的被称为 NTP 服务器的时间服务器同步它们的时间.而另一方面,一个 NTP 服务器会将它的时间和任意公共 NTP ...

  2. idea Error:java: Compilation failed: internal java compiler error

    idea 遇到Error:java: Compilation failed: internal java compiler error 是提示说你当前使用的编译器jdk版本不对. 按住Ctrl+Alt ...

  3. 顺序查找SequentialSearch

    #include <stdio.h>int SequentialSearch(int *a,int n,int x);int main(void){ //num代表查找的数 int num ...

  4. CNN初步-2

    Pooling 为了解决convolved之后输出维度太大的问题 在convolved的特征基础上采用的不是相交的区域处理     http://www.wildml.com/2015/11/unde ...

  5. POCO库——Foundation组件之加解密Crypt

    加解密Crypt:内部提供多种加解密方式.信息摘要提取.随机数产生等,具体的算法内部实现不做研究学习: DigestEngine.h :DigestEngine类作为各种摘要提取的基类,提供必要的接口 ...

  6. C++ 系列:多线程编程基础知识

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  7. Quart.NET实施参考

    参考 1.博客园: http://www.cnblogs.com/lzrabbit/archive/2012/04/13/2447609.html 2.官网:http://www.cnblogs.co ...

  8. notepad++快捷键

    notepad++现在是我最常用的文本编辑工具,其中使用的列模式编辑,也是很好使用的. 基本的快捷键: Ctrl-C,Ctrl-X,Ctrl-V,Ctrl-Y,Ctrl-A,Ctrl-F,Ctrl-S ...

  9. Ubuntu菜鸟入门(五)—— 一些编程相关工具

    一.sublime text3 sudo add-apt-repository ppa:webupd8team/sublime-text- sudo apt-get update sudo apt-g ...

  10. Swift -运算符和循环结构

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #4dbf56 } p.p2 { margin: 0.0px 0. ...