`
happmaoo
  • 浏览: 4335413 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

“装箱”问题的贪婪法解决算法

阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
/**//*
标题:>应试编程实例-[递推算法程序设计]
作者:成晓旭
时间:2002年09月14日(18:20:00-20:18:00)
实现“装箱”问题的贪婪算法实现函数
时间:2002年09月14日(22:00:00-23:18:00)
实现“装箱”问题的贪婪算法实现函数
时间:2002年09月14日(18:20:38-22:18:00)
实现“人民币找零”问题的贪婪法解决算法
*/

#include
"stdio.h"
#include
"stdlib.h"

//:============================“装箱”问题的贪婪法解决算法===========================
/**//*
作者:成晓旭
时间:2002年09月14日(18:20:38-20:00:00)
完成“装箱”问题的贪婪法解决算法
===================================================
问题描述:
设有编号为0,1,2,...,n-1的n个物品,体积分别为v0,v1,v2,...,vn-1,
将这n个物品装到容量都为V的若干个箱子内。约定这n个物品的体积均不超过
V,即对于0
编程思想:
假设每只箱子所装物品用链表来表示,链表首节点指针存入一个结构体中,
结构记录该箱子尚剩余的空间量和该箱子所装物品链表的首指针。
算法描述:
{
输入箱子的容积;
输入物品的种类数;
按体积从大到小的顺序输入各个物品的体积;
预置已用箱子链为空;
预置已用箱子计数器box_count为0;
for(i=0;i<n></n>{//物品i按以下步骤装箱;
从已用的第一只箱子开始顺序寻找能放入物品i的箱子j;
if(已用箱子都不能再放物品i)
{
另用一只箱子,并将物品i放入该箱子里;
box_count++;
}
else
将物品i放入箱子j里;
}
}

*/

//物品信息结构类型定义
#defineRESstructRES
RES
...{
intorder;//物品编号
RES*link;//另一个物品的指针
}
;
//装箱信息结构类型定义
#defineBOXstructBOX
BOX
...{
intremainder;//箱子剩余空间
RES*r_head;//箱子所装物品的物品链首节点指针
BOX*link;//箱子链的后续箱子节点指针
}
;
voidEncase_Box()
...{
//箱子计数器,箱子体积,物品种类,循环计数器
intbox_count,box_volume,category,i;
int*array;//存储各个物品体积信息的动态数组
//装箱链表的首节点、尾节点指针,程序处理临时变量指针
BOX*b_head,*b_tail,*box;
RES
*p_res,*q_res;//当前将装箱的物品节点,指向装箱链表的当前箱子的最后一个物品

printf(
"输入箱子的容积: ");
scanf(
"%d",&box_volume);
printf(
"输入物品的种类: ");
scanf(
"%d",&category);
array
=(int*)malloc(category*sizeof(int));
printf(
"按从大到小的顺序输入各个物品的体积: ");
for(i=0;icategory;i++)
...{
printf(
"物品[%d]的体积= ",i+1);
scanf(
"%d",array+i);
}

b_head
=b_tail=NULL;//预置已用箱子链表为空
box_count=0;//预置已用箱子计数器
for(i=0;icategory;i++)
...{//物品i按以下步骤装箱
//从[已用的]第一只箱子开始顺序寻找能放入物品i的箱子j;
p_res=(RES*)malloc(sizeof(RES));
p_res
->order=i;
p_res
->link=NULL;
for(box=b_head;box!=NULL;box=box->link)
...{
if(box->remainder>=array[i])
break;//找到还可装入物品i的箱子[box指针指向它]
}

if(box==NULL)
...{//已用箱子都不能装入物品i,或装箱链表为空
//创建一个新的空箱子来装载物品i
box=(BOX*)malloc(sizeof(BOX));
box
->remainder=box_volume-array[i];//计算新箱子的剩余空间
box->link=NULL;
box
->r_head=NULL;//新箱子尚未装入一件物品
if(b_head==NULL)
b_head
=b_tail=box;//本次装入的物品是当前箱子的第一个物品
else
b_tail
=b_tail->link=box;//将本次装入的物品挂接在当前箱子的物品装箱链表的末尾
box_count++;//累加所用箱子计数器
}

else
box
->remainder=box->remainder-array[i];//将物品i装入已用箱子box中
//以下11行:将物品i挂接到当前箱子box的物品装箱链表中
//让指针q_res:指向装箱链表中的当前箱子的最后一个物品
for(q_res=box->r_head;q_res!=NULL&&q_res->link!=NULL;q_res=q_res->link);
if(q_res==NULL)
...{//最后一个物品为空,当前物品i装入的箱子box是新创建的箱子
p_res->link=box->r_head;//物品i的link设为NULL
box->r_head=p_res;//新箱子box的物品链首节点指针指向物品节点p_res
}

else
...{
p_res
->link=NULL;//物品i的link设为NULL
q_res->link=p_res;//物品i挂接到当前箱子box的最后一个物品q_res之后
}

}

//输出装箱问题的处理结果
printf("用容积这[%d]的箱子[%d]个可装完以上[%d]件物品!",box_volume,box_count,category);
printf(
"各箱子所装物品情况如下: ");
for(box=b_head,i=1;box!=NULL;box=box->link,i++)
...{//第i只箱子所装物品情况
printf("第%2d只箱子,还剩余容积%4d,所装物品有: ",i,box->remainder);
for(p_res=box->r_head;p_res!=NULL;p_res=p_res->link)
printf(
" 物品号[%d],物品体积[%d] ",p_res->order+1,array[p_res->order]);
printf(
" ");
}

}

//:============================“装箱”问题的贪婪法解决算法===========================

intmain(intargc,char*argv[])
...{
//Encase_Box();
//Journey_Horse();
Run_Give_Change();
printf(
" 应用程序运行结束! ");
return0;
}



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935688


分享到:
评论

相关推荐

    装箱问题贪婪算法的运用

    贪婪法是一种不追求最优解,只希望得到较为满意解的方法。贪婪法一般可以快速得到满意的解,因为它省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪婪法常以当前情况为基础作最优选择,而不考虑各种可能的...

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    算法设计技巧10.1 贪婪算法10.1.1 一个简单的调度问题10.1.2 Huffman编码10.1.3 近似装箱问题10.2 分治算法10.2.1 分治算法的运行时间10.2.2 最近点问题10.2.3 选择问题10.2.4 一些运算问题的理论改进10.3 动态规划...

    数据结构与算法分析_Java语言描述(第2版)

    10.1 贪婪算法 10.1.1 一个简单的调度问题 10.1.2 哈夫曼编码 10.1.3 近似装箱问题 10.2 分治算法 10.2.1 分治算法的运行时间 10.2.2 最近点问题 10.2.3 选择问题 10.2.4 一些算术问题的理论改进 10.3 动态规划 ...

    数据结构与算法分析Java语言描述(第二版)

    算法设计技巧10.1 贪婪算法10.1.1 一个简单的调度问题10.1.2 哈夫曼编码10.1.3 近似装箱问题10.2 分治算法10.2.1 分治算法的运行时间10.2.2 最近点问题10.2.3 选择问题10.2.4 一些算术问题的理论改进10.3 动态规划...

    数据结构与算法分析_Java语言描述(第2版)]

    算法设计技巧10.1 贪婪算法10.1.1 一个简单的调度问题10.1.2 哈夫曼编码10.1.3 近似装箱问题10.2 分治算法10.2.1 分治算法的运行时间10.2.2 最近点问题10.2.3 选择问题10.2.4 一些算术问题的理论改进10.3 动态规划...

    数据结构与算法分析_Java_语言描述

    参考文献 第10章 算法设计技巧 10.1 贪婪算法 10.1.1 一个简单的调度问题 10.1.2 哈夫曼编码 10.1.3 近似装箱问题 10.2 分治算法 10.2.1 分治算法的运行时间 10.2.2 最近点问题 10.2.3 选择问题 ...

    数据结构与算法分析 Java语言描述第2版

    算法设计技巧10.1 贪婪算法10.1.1 一个简单的调度问题10.1.2 哈夫曼编码10.1.3 近似装箱问题10.2 分治算法10.2.1 分治算法的运行时间10.2.2 最近点问题10.2.3 选择问题10.2.4 一些算术问题的理论改进10.3 动态规划...

    数据结构与算法分析-Java语言描述(第2版)_2_2

    9.6.4 有向图 9.6.5 查找强分支 9.7 np完全性介绍 9.7.1 难与易 9.7.2 np类 9.7.3 np完全问题 小结 练习 参考文献第10章 算法设计技巧 10.1 贪婪算法 10.1.1 一个简单的调度问题 10.1.2 哈夫曼...

    数据结构与算法分析-Java语言描述(第2版)_1_2

    9.6.4 有向图 9.6.5 查找强分支 9.7 np完全性介绍 9.7.1 难与易 9.7.2 np类 9.7.3 np完全问题 小结 练习 参考文献第10章 算法设计技巧 10.1 贪婪算法 10.1.1 一个简单的调度问题 10.1.2 哈夫曼...

    java8集合源码分析-Notes:笔记

    hash冲突的解决办法:拉链法 foreach循环的原理 volatile关键字的底层实现原理 泛型类 泛型接口 泛型方法 反射 正则 捕获组和非捕获组 贪婪,勉强,独占模式 注解 JAVA8 lambda 自动装箱、自动拆箱 变长参数 内部类 ...

Global site tag (gtag.js) - Google Analytics