贪心算法:最优装载问题

简介: /*----------------------------------------------------- 给出n个物体,第i个物体的重量为wi。 选择尽量多的物体,使得总重量不超过C。 输入: n和C以及n个整数表示的wi。
/*-----------------------------------------------------
给出n个物体,第i个物体的重量为wi。
选择尽量多的物体,使得总重量不超过C。 

输入:
n和C以及n个整数表示的wi。 
输出:
按照输入物体的顺序输出n个用空格分隔的Y或N。
Y表示该物体被选中,N表示不被选中。 
最后一行输出所选中的物体的个数num和总重量w,用空格分隔。 

注意:这个地方每个物体是不可再分割的整体。 思路: 先把所有物体按重量排序(从小到大排序) , 然后贪心选择重量比较小的物体直到所选物体的总重量超过所允许的最大重量C 。 -------------------------------------------------------
*/

输入案例:

10 100
20
20
5
25
28
10
3
4
8
9

输出案例:

Y Y Y N N Y Y Y Y Y
79 8

 
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 struct obj
  5 {
  6     int weight;
  7     int id;
  8     int flag;//标示该物体是否被选中。 0标示未被选中,1表示被选中。 
  9 };
 10 
 11 void merge_sort1(struct obj *A,int x,int y,struct obj *T);//采用归并排序对A数组排序。按struct obj的weight从小到大排序。 
 12 void merge_sort2(struct obj *A,int x,int y,struct obj *T);//采用归并排序对A数组排序。按struct obj的id从小到大排序。 
 13 
 14 int cmp1(struct obj a,struct obj b);//按struct obj的weight比较a和b的大小
 15 int cmp2(struct obj a,struct obj b);//按struct obj的id比较a和b的大小 
 16 int cmpQsort1(const void *a,const void *b);//按struct obj的weight比较a和b的大小
 17 int cmpQsort2(const void *a,const void *b);//按struct obj的id比较a和b的大小 
 18 
 19 int main()
 20 {
 21     int n,c,i,w,num;
 22     struct obj *arr,*T;
 23     freopen("5.in","r",stdin);
 24     scanf("%d%d",&n,&c);
 25     arr=(struct obj *)malloc(sizeof(struct obj)*n);
 26     T=(struct obj *)malloc(sizeof(struct obj)*n);
 27     for(i=0;i<n;i++)
 28     {
 29         scanf("%d",&arr[i].weight);
 30         arr[i].id=i+1;
 31         arr[i].flag=0;
 32     }
 33     qsort(arr,n,sizeof(struct obj),cmpQsort1);
 34     //merge_sort1(arr,0,n,T);//按重量排序 
 35     /*for(i=0;i<n;i++) printf("%-3d %-3d\n",arr[i].weight,arr[i].id);
 36     printf("\n");
 37     merge_sort2(arr,0,n,T);//按id排序 
 38     for(i=0;i<n;i++) printf("%-3d %-3d\n",arr[i].weight,arr[i].id);*/
 39     
 40     w=0;//所选物体的总重量 
 41     num=0;//所选物体的个数 
 42     for(i=0;i<n;i++)
 43     {
 44         w=w+arr[i].weight;//选中arr[i]
 45         arr[i].flag=1;
 46         num++;//选中的个数加1 
 47         if(w>c) 
 48         {
 49             w-=arr[i].weight;
 50             arr[i].flag=0;
 51             num--; 
 52             break;
 53         }
 54     }
 55     qsort(arr,n,sizeof(struct obj),cmpQsort2);
 56     //merge_sort2(arr,0,n,T);//按id排序 
 57     for(i=0;i<n;i++)//其实被选中的个数和总重量可以在这个for里面统计。但是总重量不管如何在前面贪心选择的过程中都该要记录的。 
 58     {
 59         if(arr[i].flag==1) printf("Y ");
 60         else printf("N ");
 61     }
 62     printf("\n%d %d\n",w,num);
 63     
 64     free(arr);
 65     free(T);
 66     return 0;
 67 }
 68 void merge_sort1(struct obj *A,int x,int y,struct obj *T)
 69 {//采用归并排序对A数组排序。按struct obj的weight从小到大排序。 
 70     if(y-x>1)
 71     {
 72         int m=x+(y-x)/2; //划分
 73         int p=x,q=m,i=x;
 74         merge_sort1(A,x,m,T);
 75         merge_sort1(A,m,y,T);
 76         while(p<m||q<y)
 77         {
 78             //if(q>=y||(p<m&&A[p]<=A[q])) T[i++]=A[p++];
 79             if(q>=y||(p<m&&A[p].weight<=A[q].weight)) T[i++]=A[p++];
 80             //if(q>=y||(p<m&&cmp1(A[p],A[q])==-1)) T[i++]=A[p++];
 81             else T[i++]=A[q++];
 82         }
 83         for(i=x;i<y;i++) A[i]=T[i];
 84     }
 85 }
 86 void merge_sort2(struct obj *A,int x,int y,struct obj *T)
 87 {//采用归并排序对A数组排序。按struct obj的id从小到大排序。 
 88     if(y-x>1)
 89     {
 90         int m=x+(y-x)/2; //划分
 91         int p=x,q=m,i=x;
 92         merge_sort2(A,x,m,T);
 93         merge_sort2(A,m,y,T);
 94         while(p<m||q<y)
 95         {
 96             //if(q>=y||(p<m&&A[p]<=A[q])) T[i++]=A[p++];
 97             if(q>=y||(p<m&& A[p].id<=A[q].id)) T[i++]=A[p++];
 98             //if(q>=y||(p<m&&cmp2(A[p],A[q])==-1)) T[i++]=A[p++];
 99             else T[i++]=A[q++];
100         }
101         for(i=x;i<y;i++) A[i]=T[i];
102     }
103 }
104 int cmp1(struct obj a,struct obj b)
105 {//按struct obj的weight比较a和b的大小
106     if(a.weight>b.weight) return 1;
107     else if(a.weight<b.weight) return -1;
108     else return 0;
109 }
110 int cmp2(struct obj a,struct obj b)
111 {//按struct obj的id比较a和b的大小 
112     if(a.id>b.id) return 1;
113     else if(a.id<b.id) return -1;
114     else return 0;
115 }
116 int cmpQsort1(const void *a,const void *b)
117 {//按struct obj的weight比较a和b的大小
118     int t=((struct obj *)a)->weight-((struct obj *)b)->weight;
119     if(t>0) return 1;
120     else if(t<0) return -1;
121     else return 0;
122 }
123 int cmpQsort2(const void *a,const void *b)
124 {//按struct obj的id比较a和b的大小
125     int t=((struct obj *)a)->id-((struct obj *)b)->id;
126     if(t>0) return 1;
127     else if(t<0) return -1;
128     else return 0;
129 }
View Code

 

相关文章
|
算法 Java
【趣学算法】Day2 贪心算法——最优装载问题
【趣学算法】Day2 贪心算法——最优装载问题
181 0
|
机器学习/深度学习 算法 计算机视觉
【路径规划】基于遗传算法求解三维装载下的汽车零部件循环取货路径规划问题含Matlab源码
【路径规划】基于遗传算法求解三维装载下的汽车零部件循环取货路径规划问题含Matlab源码
|
6天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
6天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
101 68
|
16天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
29天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
168 80
|
17天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
17天前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。
|
15天前
|
移动开发 算法 计算机视觉
基于分块贝叶斯非局部均值优化(OBNLM)的图像去噪算法matlab仿真
本项目基于分块贝叶斯非局部均值优化(OBNLM)算法实现图像去噪,使用MATLAB2022A进行仿真。通过调整块大小和窗口大小等参数,研究其对去噪效果的影响。OBNLM结合了经典NLM算法与贝叶斯统计理论,利用块匹配和概率模型优化相似块的加权融合,提高去噪效率和保真度。实验展示了不同参数设置下的去噪结果,验证了算法的有效性。
|
14天前
|
算法 决策智能
基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法
本项目基于MATLAB2022A,使用模拟退火(SA)和蚁群优化(ACO)算法求解旅行商问题(TSP),对比两者的仿真时间、收敛曲线及最短路径长度。SA源于金属退火过程,允许暂时接受较差解以跳出局部最优;ACO模仿蚂蚁信息素机制,通过正反馈发现最优路径。结果显示SA全局探索能力强,ACO在路径优化类问题中表现优异。

热门文章

最新文章