趣学算法2-1 最优装载问题

(1)数据结构定义          double w[N]; //一维数组存储古董的重量 (2)按重量排序          sort(w, w+n); //按古董重量升序排序 (3)按照贪心策略找最优解         首先用变量 count 记录已经装载的古董个数, tmp 代表装载到船上的古董的重量,两个变     量都初始化为 0。然后按照重量从小到大排序,依次检查每个古董, tmp 加上该古董的重量,     如果小于等于载重量 c,则令 count++;否则,退出。————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <math.h>
 5 #include <iostream>
 6 #include <string>
 7 #include <algorithm>
 8 #include <queue>
 9 #include <map>
10 #include <stack>
11 using namespace std;
12 #define PI acos(-1)
13 #define INF 1<<30
14 #define EPS 1e-6
15 #define SET(a,b) memset(a,b,sizeof(a))
16 #define N 1000006
17 #define M 10010
18
19 double w[N];//古董的重量数组
20 int  main()
21 {
22
23     freopen("input.txt","r",stdin);
24     freopen("output.txt", "w", stdout);
25
26     int n,c;//c为船只最大装载量
27     cin>>c>>n;
28     int i;
29     for(i=0;i<n;i++)
30         cin>>w[i];
31     sort(w,w+n);
32     double temp=0.0;//记录装箱过程的货物重量
33     int count=0;//装载的数量
34     for(i=0;i<n;i++)
35     {
36         temp+=w[i];
37         if(temp<=c)
38             count++;
39         else break;//超过最大装载量,则退出
40     }
41     cout<<count<<endl;
42     return 0;
43 }
44
45  

原文地址:https://www.cnblogs.com/orange912/p/11521284.html

时间: 2024-10-12 20:41:01

趣学算法2-1 最优装载问题的相关文章

《趣学算法》,陈小玉

觉得还是先从简单例子程序着手,先了解各个算法的基本思想. 目录: 贪心算法 分治法 动态规划 回溯法 分支限界法 线性规划网络流 算法是指对特定问题求解步骤 的一种描述 算法的评价标准:时间复杂度与空间复杂度. 时间复杂度:考虑给定的数据数目n,关于算法的执行次数.渐进上界用O()表示,最坏情况对衡量算法的好坏具有实际的意义. 空间复杂度:算法占用的空间大小.一般将算法的辅助空间作为衡量标准. 1.贪心算法 算法思想:一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全

贪心算法之最优装载

贪心算法通过一系列的选择来得到问题的解.它所做的每一个选择都是当前状态下局部最好选择.从许多的贪心算法求解的问题可以看到可用贪心算法求解的问题一般具有两个重要的性质:贪心选择性质和最优子结构性质. 1.贪心选择性质 贪心选择性质是 指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到.与动态规划算法的不同之处是贪心算法只依赖在当前状态下做出最优选择,然后再去解做出这个选择后产生的相应的子问题.贪心算法依赖于以往做出的选择,但是绝不依赖未来做出的选择.所以贪心算法是自顶向下解决问题

贪心算法:最优装载问题

/*----------------------------------------------------- 给出n个物体,第i个物体的重量为wi. 选择尽量多的物体,使得总重量不超过C. 输入: n和C以及n个整数表示的wi. 输出: 按照输入物体的顺序输出n个用空格分隔的Y或N. Y表示该物体被选中,N表示不被选中. 最后一行输出所选中的物体的个数num和总重量w,用空格分隔. 注意:这个地方每个物体是不可再分割的整体. 思路: 先把所有物体按重量排序(从小到大排序) , 然后贪心选择重量

贪心算法之最优装载问题

问题描述: 给出n个物体,第i个物体的重量是Wi,选择尽量多的物体,使得总重量不超过C. 问题分析: 这是一个很典型的用贪心算法的题目.要想让装的物体越多,自然装的最轻的物体就越多.因此可以对物体的重量由小到大进行排序,然后依次装载即可.这就体现了贪心算法只顾眼前,但却可以得到最优解. 解决问题:  代码如下 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> //为了引入memcpy 4 /

回溯算法 - 最优装载

(1)问题描述:有一批共 n 个集装箱要装上 2 艘载重量分别为 capacity1 和 capacity2 的轮船,其中集装箱 i 的重量为 wi,且装载问题要求确定是否有一个合理的装载方案可将这些集装箱装上这 2 艘轮船.如果有,找出一种装载方案. 例如:当 n = 3, capacity1 = capacity2= 50, 且 w = [10, 40, 40] 时,则可以将集装箱 1 和 2 装到第一艘轮船上,而将集装箱 3 装到第二艘轮船上:如果 w = [20, 40, 40],则无法

0-1 背包问题、背包问题、最优装载问题、哈夫曼编码,这几个问题的思想是什么?

0-1背包问题: 给定n种物品和一个背包.物品i的重量是Wi,其价值为Vi,背包的容量为C.应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包.不能将物品i装入背包多次,也不能只装入部分的物品i. 背包问题: 与0-1背包问题类似,所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n. 解决方法:求每个物品的价值重量比,即价值/重量.然后添加价值重量比最大的物品,添加结束如果

贪心算法一:最优装载问题

1.基本思想: 贪心算法是通过一系列的选择来得到问题的解,它所做的选择都是当前情况下最优的选择,即贪心算法并不考虑整体最优,而考虑的是当前情况下的局部最优,即贪心选择. 2.贪心算法的两个性质: 1)贪心选择性质:所求解的问题的整体最优解可以通过一系列局部最优的选择来,即贪心选择达到.贪心选择所依赖的是以前所做过的选择,而对以后所做的选择没有关系. 2)最优子结构性质:一个问题的最优解包含其子问题的最优解. 3.贪心算法与动态规划的区别: 动态规划是通过自底向上的方式解决子问题,贪心算法是通过自

回溯法--无优化 最优装载问题

//#include "stdafx.h" // 回溯法,解空间分为排列数和子集树,前者是不同节点顺序的排列,后者是一个(0,1,...)的向量子集// 最大装载问题,是一个NP问题,目前只计算第一艘船,属于子集树// 有几个货物,子集树就有几层,当前题目为5层// 我感觉递归还是太过于精巧和经凑,很难挖空心思自己写出来,多熟悉别人现有的程序是一个好办法. #include<iostream>using namespace std; template<class T&

最优装载(贪心)

描述:有一批集装箱要装上一艘载重量为C的轮船.其中集装箱i的重量为wi.最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船. 贪心算法之最优装载 给出n个物体,第i个物体的重量为wi. 选择尽量多的物体,使得总重量不超过C. 注意:这个地方每个物体是不可再分割的整体. 思路: 先把所有物体按重量排序(从小到大排序) , 然后贪心选择重量比较小的物体直到所选物体的总重量超过所允许的最大重量C .一般选择是从最小的开始,所以先要排序 第一种方法(容器) #include <i