1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define N 6
  5. #define V 100
  6.  
  7. typedef struct box // 使用 typedef 来为用户自定义的数据类型box取一个新的名字BOX
  8. {
  9. int no;
  10. int size;
  11. struct box* next;
  12. }BOX;
  13. // 使用访问结构的指针访问结构的成员
  14. void init_list(BOX** H) // 声明了一个指向 BOX 类型指针的指针 *H为一级指针,&(*H)为一级指针的地址,即将一级指针的地址赋值给二级指针H
  15. *H = (BOX*)malloc(sizeof(BOX)); // H表示一级指针的地址,*H表示一级指针的值,**H表示普通变量的值,由于一级指针指向结构体BOX,故可以通过一级指针访问结构的成员
  16. (*H)->no = 0;
  17. (*H)->size = 0;
  18. (*H)->next = NULL;
  19. }
  20.  
  21. BOX* find_p(BOX* H, int volume, int v)
  22. {
  23. BOX* p = H->next; // 一开始,由于H->next为NULL,故p为空指针.第二轮,由于H->next不为空,故将p指针指向H->next指针指向的对象即(1,60,NULL)
  24. while(p!=NULL)
  25. {
  26. if(p->size+volume <= v) // 60+45>100,不执行
  27. break;
  28.  
  29. p = p->next; //第二轮,p=NULL
  30. }
  31.  
  32. return p;
  33. }
  34. //让q指针指向H指针指向的对象,通过q指针访问H指针指向的对象的成员,由于H指针指向对象的成员也是一个BOX类型的指针,然后让H指针指向对象的成员next指向p指针指向的对象(1,60,NULL)
  35. void add_list_tail(BOX* H, BOX* p) // H,p均为一级指针,H指针指向(0,0,NULL),p指针指向(1,60,NULL)
  36. {
  37. BOX* tmp = H->next; // H->next为NULL,此时tmp为空指针
  38. BOX* q = H; // q指针指向H指针指向的对象
  39.  
  40. while(tmp!=NULL)
  41. {
  42. q = tmp;
  43. tmp = tmp->next;
  44. }
  45.  
  46. q->next = p; //q为一级指针,q->next表示结构体的成员,即一级指针指向p指针指向的对象,此时两个对象相连
  47. }
  48.  
  49. void print_list(BOX* H)
  50. {
  51. BOX* p = H->next;
  52. while(p!=NULL)
  53. {
  54. printf("%d:%d\n", p->no, p->size);
  55. p = p->next;
  56. }
  57. }
  58.  
  59. int add_box(int volume[], int v)
  60. {
  61. int count = 0;
  62. int i;
  63. BOX* H = NULL; //定义一个Box型的指针,指针的值为NULL,即空指针
  64.  
  65. init_list(&H);
  66.  
  67. for(i=0;i<N;i++)
  68. {
  69. BOX* p = find_p(H, volume[i], v); // 一级指针p指向结构体
  70. if(p==NULL)
  71. {
  72. count++;
  73. p = (BOX*)malloc(sizeof(BOX));
  74. p->no = count; // 通过一级指针给结构体成员赋值 1
  75. p->size = volume[i]; // 60
  76. p->next = NULL; //NULL,此时p指针指向(1,60,NULL)结构体,H指针指向(0,0,NULL)
  77. add_list_tail(H, p); //此时H指向的对象的成员next指向p指针指向的成员
  78. }
  79. else
  80. {
  81. p->size += volume[i]; //第二轮,将两个数相加
  82. }
  83. }
  84.  
  85. print_list(H);
  86.  
  87. return count;
  88. }
  89.  
  90. int main(int argc, char *argv[])
  91. {
  92. int ret;
  93. int volumes[] = {60, 45, 35, 20, 20, 20};
  94.  
  95. ret = add_box(volumes, V);
  96.  
  97. printf("%d\n", ret);
  98.  
  99. system("PAUSE");
  100. return 0;
  101. }

装箱问题注意事项:

1、n中物品要从大到小排号序。

2、先装大的,再从大到小装小的,两个数相加不大于100即可。

3、每只箱子所装物品用链表来表示,

C语言:贪心算法之装箱问题的更多相关文章

  1. C语言 · 贪心算法

    发现蓝桥杯上好多题目涉及到贪心,决定学一学. 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说:不从整体最优上考虑,而是在某种意义上的局部最优解.其关键是贪心策略的选择,选择的贪心 ...

  2. C语言词法分析中的贪心算法

    C语言词法分析中的贪心算法 当我们写出a---b这种语句的时候我们应该考虑C语言的编译器是如何去分析这条语句的. C语言对于解决这个问题的解决方案可以归纳为一个很简单的规则:每一个符号应该包含尽可能多 ...

  3. #C++初学记录(贪心算法#结构体#贪心算法)

    贪心算法#结构体 Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋 ...

  4. 组合优化学习笔记<之>从贪心算法到子集系统再到拟阵

    贪心算法是用的比较多的一种优化算法,因为它过程简洁优美,而且结果有效.有些优化问题如最大权森林(MWF)是可以用贪心问题求解的,由于最小支撑树(MST)问题与MWF是等价的,所以MST也是可以用贪心算 ...

  5. [C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)

    1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 ...

  6. [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)

    1 Floyd算法 1.1 解决问题/提出背景 多源最短路径(带权有向图中,求每一对顶点之间的最短路径) 方案一:弗洛伊德(Floyd算法)算法 算法思想:动态规划法 时间复杂度:O(n^3) 形式上 ...

  7. [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)

    一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...

  8. 贪心算法(Greedy Algorithm)

    参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...

  9. 算法导论----贪心算法,删除k个数,使剩下的数字最小

    先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...

随机推荐

  1. Python基础随笔①(MOOC)

    @ 目录 前言 概述 主体 1.基本语法元素 ①实例:温度转换 要求 分析 代码部分 运行结果 ②作业:Hello World的条件输出 要求 分析 代码 运行结果 ③作业:数值运算 要求 分析 代码 ...

  2. 从零开始教你安装Oracle数据库

    1.数据库安装 1.1下载 根据自己的操作系统位数,到oracle官网下载(以oracle 11g 为例) 之后把两个压缩包解压到同一个文件夹内(需要注意的是,这个文件夹路径名称中最好不要出现中文.空 ...

  3. C - Door Man(欧拉回路_格式控制)

    现在你是一个豪宅的管家,因为你有个粗心的主人,所以需要你来帮忙管理,输入会告诉你现在一共有多少个房间,然后会告诉你从哪个房间出发,你的任务就是从出发的房间通过各个房间之间的通道,来把所有的门都关上,然 ...

  4. LVS-DR 模式

    SNAT(Source Network Address Translation)源地址转换,类似家里路由器设置,内网地址向外访问时,发起访问的内网ip地址转换为指定的 IP 地址 DNAT(Desti ...

  5. kubernetes进阶(一) kubectl工具使用详解

    管理k8s核心资源的三种基本方法: 一.陈述式-主要依赖命令行工具  --可以满足90%以上的使用场景,但是缺点也很明显: 命令冗长,复杂,难以记忆 特定场景下,无法实现管理需求 对资源的增.删.查操 ...

  6. 鸟哥的linux私房菜——第四章学习

    ******************第四章学习****************** [热键] 1.Tab键:命令补全:文件补全: 2.Ctrl+c:中断目前指令: 3.Ctrl+d:离开当前文本界面: ...

  7. HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解

    题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...

  8. HDU 3065 病毒侵袭持续中(AC自动机 模板)题解

    题意:给出主串中每个模式串的个数 思路:毒瘤出题人多组数据没说给的是多组数据. 板子: struct Aho{ struct state{ int next[130]; int fail, cnt; ...

  9. PicGo:搭建图床

    PicGo:搭建图床 PicGo 免费搭建个人图床工具PicGo: 支持Windows.MacOS 和 Linux 软件目前覆盖的图床有8个平台: SM.MS图床.腾讯云COS.GitHub图床.七牛 ...

  10. C++中函数的形式参数引用

    形式参数的传递方式 值传递 值传递是将数值传递到程序中,这种方式传递是单向传递 但是如果想要双向传递,这种视频无法满足: 引用传递 引用传递可以实现双向的传递 为了对比处两个之间的差异,这里举出两个例 ...