CS_C/C++_Xcode_Algorithm

Xcode

  • 创建项目不能用中文输入法

  • 注释把光标放在函数上面,摁下 command+ option + /

  • 竖向选择器
    首先应该是一下当前软件是否支持这种用法
    做法如下:
    按住option键,如果光标变成十字选择线,说明支持,否则说明当前软件不支持。
    如果支持具体做法如下:
    按下option键,待光标变成十字线后去选择,然后conmand+C,command+V
    在这里插入图片描述

  • xcode 添加项目文件,这样可以把remove reference的文件从文件夹里重新添加进文件
    在这里插入图片描述

duplicate symbol

经常会出现重复标签的问题,问题如下

duplicate symbol '_c' in:
    /Users/zhizekai/Library/Developer/Xcode/DerivedData/algorithm-dopaucjulatrxubmdwtgbwvcueca/Build/Intermediates.noindex/algorithm.build/Debug/algorithm.build/Objects-normal/x86_64/water.o
    /Users/zhizekai/Library/Developer/Xcode/DerivedData/algorithm-dopaucjulatrxubmdwtgbwvcueca/Build/Intermediates.noindex/algorithm.build/Debug/algorithm.build/Objects-normal/x86_64/BackTracking_zzk.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这问题出现的主要原因是在一个project当中global variable 定义出了问题,两个文件中出现了相同名字的global variable ,解决办法就是将其中一个variable前加上static,变成静态变量

1)全局变量是不显式用static修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。
2)全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。

关于静态全局变量和全局变量

文档注释

把光标定位到需要添加注释文档的对象起始行,或上方的空白行。按下“command + Option + /”,即“⌘ + ⌥ + /”。(如果是 Windows 键盘则为“Win键 + ALT + /”)

0/1背包问题

using namespace std;

int total_weight = 10;  //pack total weight
int w[6] = { 0,5,4,3,2,1};  //item weight
int v[6] = { 0,1,3,4,6,5};  //item value
int dp[11] = { 0 };
int  dp_handle()
{
    //5件物品
    for(int i=1;i<=5;i++) {
        //10是背包总重量,j是当前背包剩余重量
        for (int j = 10; j >= w[i]; --j) {
            //dp[j] 是物品价值最优
            //不装和装哪个的价值大
            //装了当前物品之后,把j逐步k扩增,遍历在装下此物品的基础上还能装哪些物品
            dp[j] = max(dp[j], dp[j-w[i]] + v[i]);
        }
        
    }
    
    cout << "总的价值为: " << dp[10] << endl;
    return 0;
}

( y 1 , y 2 , . . . , y n ) (y_1,y_{2},...,y_n) (y1,y2,...,yn) 是所给0-1背包问题的一个最优解,则 ( y 1 , y 2 , . . . , y n ) (y_1,y_2,...,y_n) (y1,y2,...,yn)是下面相应子问题的最优解:
max ⁡ ∑ i = 2 n v i x i { ∑ i = 2 n w i x i ≤ c − w i y i x i ∈ { 0 , 1 } , 2 ≤ i ≤ n \max \sum_{i=2}^{n} v_ix_i \\ \begin{cases} \sum_{i=2}^n w_i x_i \le c-w_i y_i \\ x_i \in \{0,1\},2 \le i \le n \end{cases} maxi=2nvixi{i=2nwixicwiyixi{0,1},2in
因若不然,设 ( z 2 , z 3 , . . . , z n ) (z_2,z_3,...,z_n) (z2,z3,...,zn)是上述子问题的最优解,而 ( y 1 , y 2 , . . . , y n ) (y_1,y_2,...,y_n) (y1,y2,...,yn) 不是它的最优解。由此可知, ∑ i = 2 n v i z i > ∑ i = 2 n v i y i \sum_{i=2}^{n}v_i z_i \gt \sum_{i=2}^{n}v_i y_i i=2nvizi>i=2nviyi,且 w i y i + ∑ i = 2 n w i z i ≤ c w_iy_i + \sum_{i=2}^{n}w_i z_i \le c wiyi+i=2nwizic,因此
v 1 y 1 + ∑ i = 2 n v i z i > ∑ i = 1 n v i y i w i y i + ∑ i = 2 n w i z i ≤ c v_1y_1 + \sum_{i=2}^{n}v_i z_i \gt \sum_{i=1}^{n}v_i y_i \\ w_iy_i + \sum_{i=2}^{n}w_i z_i \le c v1y1+i=2nvizi>i=1nviyiwiyi+i=2nwizic
说明有了一个更优解,原来的 ( y 1 , y 2 , . . . , y n ) (y_1,y_{2},...,y_n) (y1,y2,...,yn)不是最优解,就矛盾了

快速排序

//
//  sortzzk.hpp
//  algorithm
//
//  Created by 支泽楷 on 2020/5/15.
//  Copyright © 2020 支泽楷. All rights reserved.
//

#ifndef sortzzk_hpp
#define sortzzk_hpp

#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;

class sortzzk{
public:
    
    int sortzzk_main();
    void quicksort(int left, int right, vector<int>& arr);

};
#endif /* sortzzk_hpp */

//
//  sortzzk.cpp
//  algorithm
//
//  Created by 支泽楷 on 2020/5/15.
//  Copyright © 2020 支泽楷. All rights reserved.
//

#include "sortzzk.hpp"

void sortzzk::quicksort(int left,int right, vector<int> &arr) {
    if (left >= right) {
        return;
    }
    int i,j,base,temp;
    i = left;j = right;
    base = arr[left];
    while (i < j) {
        while (arr[j] > base && i< j) {
            j--;
        }
        while (arr[i] < base && i<j) {
            i++;
        }
        if (i < j) {
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    
    arr[left] = arr[i];
    arr[i] = base;
    quicksort(left, i - 1, arr);//递归左边
    quicksort(i + 1, right, arr);//递归右边
}


int sortzzk::sortzzk_main(){

    vector<int> arr;
    arr = {3,1 , 2 ,5  ,4 , 6,  9 ,7 , 10,  8};
    quicksort(0, 9, arr);
    return 0 ;
}

最长公共子序列

C++实现LCS
c [ i , j ] = { 0 if  i = 0  or  j = 0 c [ i − 1 , j − 1 ] + 1 if  i , j > 0  and  x i = y j max ⁡ ( c [ i , j − 1 ] , c [ i − 1 , j ] ) if  i , j > 0  and  x i ≠ y j c[i,j] = \begin{cases} 0 &\text{if } i=0 \text{ or } j = 0\\ c[i-1,j-1] + 1 &\text{if } i,j > 0 \text{ and } x_i = y_j \\ \max(c[i,j-1],c[i-1,j]) &\text{if } i,j > 0 \text{ and } x_i \not= y_j \end{cases} c[i,j]=0c[i1,j1]+1max(c[i,j1],c[i1,j])if i=0 or j=0if i,j>0 and xi=yjif i,j>0 and xi=yj

x i = y j x_i = y_j xi=yj时,在上一个最优子结构 c [ i − 1 , j − 1 ] c[i-1,j-1] c[i1,j1]的基础上加1
如果 x i ≠ y j x_i \not= y_j xi=yj 选择子结构里 c [ i , j − 1 ] c[i,j-1] c[i,j1] c [ i − 1 , j ] c[i-1,j] c[i1,j]最优的一个当作最新的最优子结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值