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

  1.基本思想:

  贪心算法是通过一系列的选择来得到问题的解,它所做的选择都是当前情况下最优的选择,即贪心算法并不考虑整体最优,而考虑的是当前情况下的局部最优,即贪心选择。

  2.贪心算法的两个性质:

  1)贪心选择性质:所求解的问题的整体最优解可以通过一系列局部最优的选择来,即贪心选择达到。贪心选择所依赖的是以前所做过的选择,而对以后所做的选择没有关系。

  2)最优子结构性质:一个问题的最优解包含其子问题的最优解。

  3.贪心算法与动态规划的区别:

  动态规划是通过自底向上的方式解决子问题,贪心算法是通过自顶向下的迭代方式做出贪心选择,求解问题的最优解。两共同点是都具有最优子结构性质。

  4.最优装载问题:采用重量最轻者先装载的贪心选择策略。

  

 1 #include "stdafx.h"
 2 #include <iostream>
 3 using namespace std;
 4 const int N = 4;
 5 template <class type>
 6 void Swap(type &x, type &y){
 7     type temp = x;
 8     x = y;
 9     y = temp;
10 }
11 void BubleSort(int w[],int t[], int n){
12     for (int i = 1; i <= n; i++)
13     {
14         t[i] = i;
15     }
16
17     for  (int i = 1;  i < n; i++)
18     {
19         int temp = i;
20         for (int j =i+1; j <= n; j++){
21             if (w[temp]>w[j])
22             {
23                 temp = j;
24                 Swap(w[i], w[j]);
25             }
26         }
27         Swap(t[i], t[temp]);
28     }
29 }
30 void BestLoad(int w[], int x[],int c, int n){
31
32     int t[N + 1] = {0};//记录原始索引
33     BubleSort(w, t, N);
34     for (int i = 1; i <= n; i++)
35     {
36         x[i] = 0;
37     }
38     for (int i = 1; i <= n&& w[t[i]] <= c; i++)
39     {
40         x[t[i]] = 1;
41         c -= w[t[i]];
42     }
43 }
44 int main(){
45     int c = 50;
46     int w[] = { 0, 20,10,25,15 };
47     int x[N + 1];
48     cout << "载重容量为:\n" << c << endl;
49     cout << "物品的重量分别为:" << endl;
50     for (int i = 1; i <= N; i++)
51     {
52         cout << w[i] << " ";
53     }
54     cout << endl;
55     BestLoad(w,x, c, N);
56     cout << "贪心选择结果为:" << endl;
57     for (int i = 1; i <= N; i++)
58     {
59         cout << x[i] << " ";
60     }
61     cout << endl;
62 }

  

时间: 2024-11-05 16:03:42

贪心算法一:最优装载问题的相关文章

贪心算法之最优装载

贪心算法通过一系列的选择来得到问题的解.它所做的每一个选择都是当前状态下局部最好选择.从许多的贪心算法求解的问题可以看到可用贪心算法求解的问题一般具有两个重要的性质:贪心选择性质和最优子结构性质. 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 /

最优装载(贪心)

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

最优装载问题_贪心

一.  问题描述    有一批集装箱要装上一艘载重为C的轮船.其中集装箱i的重量为Wi.最优装载问题要去确定在装载体积不受限制的情况下,将极可能多的集装箱装上轮船. 二.  解题思路及所选算法策略的可行性分析 使用贪心算法. 问题描述为: max∑Xi,∑WiXi<=C,Xi∈{0,1}   1<=i<=n 其中,变量Xi=0表示不装入集装箱i,Xi=1表示装入集装箱i. 贪心选择性质: 设集装箱已依其重量从小到大排序,(X1,X2,…,Xn)是最优装问题的一个最优解.又设k=min{i

数据结构与算法一

题目一:求1!+2!+-..+n! 的和的后6位,(注意n的范围) #include <iostream> using namespace std; const int MAX = 1000000; int getResu(int n) { int sum=0; int temp= 1; for(int i=1; i <= n; i++) { temp *= i; temp %= MAX; sum += temp; sum %= MAX; } return sum ; } int mai

0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.其中每种物品只有一件,可以选择放或者不放. 最优子结构性质:对于0-1问题,考虑重量至多W的最值钱的一包东西.如果去掉其中一个物品j,余下的必是除j以外的n-1件物品中,可以带走的重量

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

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

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

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