码迷,mamicode.com
首页 > 编程语言 > 详细

《趣学算法》,陈小玉

时间:2017-08-26 15:59:53      阅读:1754      评论:0      收藏:0      [点我收藏+]

标签:over   ret   back   sed   htm   iostream   线性   cin   设计   

觉得还是先从简单例子程序着手,先了解各个算法的基本思想。

目录:

  1. 贪心算法
  2. 分治法
  3. 动态规划
  4. 回溯法
  5. 分支限界法
  6. 线性规划网络流

算法是指对特定问题求解步骤 的一种描述

算法的评价标准:时间复杂度与空间复杂度。

时间复杂度:考虑给定的数据数目n,关于算法的执行次数。渐进上界用O()表示,最坏情况对衡量算法的好坏具有实际的意义。

空间复杂度:算法占用的空间大小。一般将算法的辅助空间作为衡量标准。

1.贪心算法

算法思想:一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择从而得到全局最优的解决方案

小插曲:c++中有排序函数sort,可以直接利用

#include<iostream>
using namespace std;
#include<algorithm>

int main()
{
    int a[4] = { 4,7,3,5 };
    for (int i = 0; i < 4; i++)
        cout << a[i] << " ";
    cout << endl << "排序后::::" << endl;
    sort(a, a + 3);          //可以只对某几项进行排列
    for (int i = 0; i < 4; i++)
        cout << a[i] << " ";


    cin.ignore();
    return 0;
}

4 7 3 5
排序后::::
3 4 7 5

 

 

举列1:最优装载问题

描述:海盗们截获一批财宝,海盗船载重有限,如何尽可能多的获取宝贝??

算法设计:每次选择重量最小的,直到不能再装为止。

代码:

技术分享
#include<iostream>
using namespace std;
#include<algorithm>

const int N = 100;
double w[N];   //古董 的重量数组

int main()
{
    double c;
    int n;
    cout << "请输入载重量c以及古董个数n:" << endl;
    cin >> c >> n;

    cout << "请输入每个古董的重量" << endl;

    for (int i = 0; i < n; i++)
    {
        cin >> w[i];
    }
    sort(w, w + n);

    double temp = 0;
    int ans = 0;

    for (int i = 0; i < n; i++)
    {
        temp += w[i];
        if (temp <= c)
            ans++;
        else
            break;
    }
    cout << "最大装载数目:" << ans << endl;

    cin.ignore();
    cin.ignore();
    cin.ignore();
    return 0;
}
View Code

请输入载重量c以及古董个数n:
30 8
请输入每个古董的重量
4 10 7 11 3 5 14 2
最大装载数目:5

 扩展:如何知道装入了那些宝贝呢??

引入结构体数组,增加宝贝的编号属性,具体程序如下

技术分享
 1 #include<iostream>
 2 using namespace std;
 3 #include<algorithm>
 4 
 5 const int N = 100;
 6 struct two {
 7     int n;    //宝物标号
 8     double w;  //宝物重量
 9 }s[N];
10 //double w[N];   //古董 的重量数组
11 bool cmp(two a, two b)
12 {
13     return a.w < b.w;
14 }
15 
16 int main()
17 {
18     double c;
19     int n;
20     cout << "请输入载重量c以及古董个数n:" << endl;
21     cin >> c >> n;
22 
23     cout << "请输入每个古董的重量" << endl;
24     
25     for (int i = 0; i < n; i++)
26     {
27         cin >> s[i].w;
28         s[i].n = i + 1;
29     }
30     sort(s, s + n, cmp);
31 
32     double temp = 0;
33     int ans = 0;
34 
35     for (int i = 0; i < n; i++)
36     {
37         temp += s[i].w;
38         if (temp <= c)
39         {
40             ans++;
41             cout << "选择第" << s[i].n << "个宝贝" << endl;
42         }
43         else
44             break;
45     }
46     cout << "最大装载数目:" << ans << endl;
47     
48 
49     cin.ignore();
50     cin.ignore();
51     cin.ignore();
52     return 0;
53 }
View Code

请输入载重量c以及古董个数n:
30 8
请输入每个古董的重量
4 10 7 11 3 5 14 2
选择第8个宝贝
选择第5个宝贝
选择第1个宝贝
选择第6个宝贝
选择第3个宝贝
最大装载数目:5

 

《趣学算法》,陈小玉

标签:over   ret   back   sed   htm   iostream   线性   cin   设计   

原文地址:http://www.cnblogs.com/skylover/p/7435312.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!