贪心算法:最优装载问题

简介: /*----------------------------------------------------- 给出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 贪心算法——最优装载问题
138 0
|
机器学习/深度学习 算法 计算机视觉
【路径规划】基于遗传算法求解三维装载下的汽车零部件循环取货路径规划问题含Matlab源码
【路径规划】基于遗传算法求解三维装载下的汽车零部件循环取货路径规划问题含Matlab源码
|
15天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
15天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
1月前
|
算法
基于模糊控制算法的倒立摆控制系统matlab仿真
本项目构建了一个基于模糊控制算法的倒立摆控制系统,利用MATLAB 2022a实现了从不稳定到稳定状态的转变,并输出了相应的动画和收敛过程。模糊控制器通过对小车位置与摆的角度误差及其变化量进行模糊化处理,依据预设的模糊规则库进行模糊推理并最终去模糊化为精确的控制量,成功地使倒立摆维持在直立位置。该方法无需精确数学模型,适用于处理系统的非线性和不确定性。
基于模糊控制算法的倒立摆控制系统matlab仿真
|
16天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
18天前
|
算法
基于SIR模型的疫情发展趋势预测算法matlab仿真
该程序基于SIR模型预测疫情发展趋势,通过MATLAB 2022a版实现病例增长拟合分析,比较疫情防控力度。使用SIR微分方程模型拟合疫情发展过程,优化参数并求解微分方程组以预测易感者(S)、感染者(I)和移除者(R)的数量变化。![]该模型将总人群分为S、I、R三部分,通过解析或数值求解微分方程组预测疫情趋势。
|
18天前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
3天前
|
机器学习/深度学习 算法
基于心电信号时空特征的QRS波检测算法matlab仿真
本课题旨在通过提取ECG信号的时空特征并应用QRS波检测算法识别心电信号中的峰值。使用MATLAB 2022a版本实现系统仿真,涵盖信号预处理、特征提取、特征选择、阈值设定及QRS波检测等关键步骤,以提高心脏疾病诊断准确性。预处理阶段采用滤波技术去除噪声,检测算法则结合了一阶导数和二阶导数计算确定QRS波峰值。
|
3天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了一种结合粒子群优化(PSO)与分组卷积神经网络(GroupCNN)的时间序列预测算法。该算法通过PSO寻找最优网络结构和超参数,提高预测准确性与效率。软件基于MATLAB 2022a,提供完整代码及详细中文注释,并附带操作步骤视频。分组卷积有效降低了计算成本,而PSO则智能调整网络参数。此方法特别适用于金融市场预测和天气预报等场景。