《趣学算法》,陈小玉

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

目录:

  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;
}

请输入载重量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 }

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

时间: 2024-10-16 23:31:58

《趣学算法》,陈小玉的相关文章

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

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

1169: 零起点学算法76——绝对公正的裁判

1169: 零起点学算法76--绝对公正的裁判 Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 510  Accepted: 336[Submit][Status][Web Board] Description 大家知道我们学校的OnlineJudge吗?,你知道他会告诉你什么呢? Compiling : 您提交的代码正在被编译.Running : 您的程序正在OJ上运行.Judging : OJ

1165: 零起点学算法72——首字母变大写

1165: 零起点学算法72--首字母变大写 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 705  Accepted: 439[Submit][Status][Web Board] Description 输入一个英文句子,将每个单词的第一个字母改成大写字母. Input 输入数据包含多个测试实例,每个测试实例是一个长度不超过100的英文句子,占一行. Output 请输出按照要求改写后的英文句

1127: 零起点学算法34——继续求多项式

1127: 零起点学算法34--继续求多项式 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 3481  Accepted: 1985[Submit][Status][Web Board] Description 输入1个正整数n, 计算1+(1+2)+(1+2+3)+...+(1+2+3+...+n) Input 输入正整数n(多组数据) Output 输出1+(1+2)+(1+2+3)+...+

1128: 零起点学算法35——再求多项式(含浮点)

1128: 零起点学算法35--再求多项式(含浮点) Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 2141  Accepted: 1002[Submit][Status][Web Board] Description 输入一个整数n,计算 1+1/(1-3)+1/(1-3+5)+...+1/(1-3+5-...+2n-1)的值 Input 输入一个整数n(多组数据) Output 出1+1/(1

1097:零起点学算法04——再模仿一个算术题

1097: 零起点学算法04--再模仿一个算术题 Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 2627  Accepted: 2202[Submit][Status][Web Board] Description 上题会模仿了吧.再来模仿一个. 现在要求你模仿一个乘法的算术题 Input 没有输入 Output 输出9乘以10的值 Sample Output 90 Source 零起点学算法

1098: 零起点学算法05——除法算术题

1098: 零起点学算法05--除法算术题 Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 2346  Accepted: 1932[Submit][Status][Web Board] Description 乘法会了,除法也一样的.不要跟我说不会哦. Input 没有输入 Output 输出12除以2的值,计算让计算机去做哦 Sample Output 6 Source 零起点学算法 1 #i

1099:零起点学算法06——再来一题除法算术题

1099: 零起点学算法06--再来一题除法算术题 Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 4811  Accepted: 1917[Submit][Status][Web Board] Description 再来一题除法算术题 Input 没有输入 Output 输出8除以5,保留1位小数 Sample Output 1.6 Source 零起点学算法 1 # include <std

1101: 零起点学算法08——简单的输入和计算(a+b)

1101: 零起点学算法08--简单的输入和计算(a+b) Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 3669  Accepted: 1997[Submit][Status][Web Board] Description 前面7道题做下来,对输出和计算有点感觉了吧? 不过很可惜的是前面的做法,好像太死了,写了一个计算3+4的程序,计算5+6又得改程序,计算机真的只能这么实现,那么我们比计算机