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=2∑nvixi{∑i=2nwixi≤c−wiyixi∈{0,1},2≤i≤n
因若不然,设
(
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=2nwizi≤c,因此
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=2∑nvizi>i=1∑nviyiwiyi+i=2∑nwizi≤c
说明有了一个更优解,原来的
(
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[i−1,j−1]+1max(c[i,j−1],c[i−1,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[i−1,j−1]的基础上加1
如果
x
i
≠
y
j
x_i \not= y_j
xi=yj 选择子结构里
c
[
i
,
j
−
1
]
c[i,j-1]
c[i,j−1]和
c
[
i
−
1
,
j
]
c[i-1,j]
c[i−1,j]最优的一个当作最新的最优子结构