1.裝載問題
思路:每種貨物有兩種可能:裝與不裝,所以只用在遞迴時迴圈兩種可能即可,然後把每次的值進行maxn然後輸出(前提當前的sum<=承重量)。
注意:計算是否超標需用乙個變數儲存,防止重複計算,否則會超時。
**:
#include
using
namespace std;
int a[46]
, maxn =-1
, n, c, t;
void
work
(int deep,
int sum)
for(
int i =
0; i <=
1; i++
)else
work
(deep +
1, sum);}
}int
main()
2.工作分配問題
思路:用乙個陣列標記每種工作是否已經有人正在做,然後已經在做則continue,然後對於所有方案求出最小值。
注意:如果當前的sum已經超過minn,則可以直接結束,不然會爆最後2個點。
**:
#include
using
namespace std;
int a[21]
[21], minn = int_max, n;
bool v[21]
;void
work
(int deep,
int sum)
for(
int i =
1; i <= n; i++)}
intmain()
3.有重複元素的排列問題
思路:先把序列從小到大排序,再把26個字母的個數統計,沒有則continue,有就把個數減少,其餘跟全排列一模一樣。
注意點:要把字元先轉化成整數,再把整數轉化成字元。
**
#include
using
namespace std;
int n, t;
char s[
1000];
char v[
1000];
int v2[27]
;void
work
(int deep)
for(
int i =
1; i <=
26; i++)}
intmain()
4.最佳排程問題
思路:把每個任務分別放在k臺機器上,然後求出這些機器工作時間的最大值,在把每種排程方法求出最小值,輸出。
注意點:1.把maxn可以提前算出,大於minn直接跳過,加快速度。2。在此基礎上,把所有任務從大到小排序,可以更加快。
**
#include
using
namespace std;
int n, k, x[
100]
, a[
100]
, minn = int_max;
bool
cmp(
int a,
int b)
void
work
(int deep,
int maxn)
for(
int i =
1; i <= k; i++)}
intmain()
5.字串行
思路:用1、2、3來表示a、b、c,如果長度超過4了,就判斷從當前序列末尾倒數4個,判斷是否重複,如果相等則不合法,合法則++。
注意點:這裡不合法是continue,不是return。
**
#include
using
namespace std;
int n, a[13]
, b[4]
, t;
void
work
(int deep)
for(
int i =
1; i <=
3; i++
)work
(deep +1)
;}}int
main()
7.【經典】n皇后問題
思路:可以把行不考慮,直接考慮列和對角線,處於同一左對角線的所有兩個座標之和相等,處於同一右對角線的所有兩個座標之差相等,只要把它們全部存下來,看看有無重複就行。
**
#include
using
namespace std;
int l[14]
, z[14]
, y[14]
, t, n;
bool flag;
void
work
(int deep,
bool flag =
false
)for
(int i =
1; i <= n; i++)if
(flag ==
true
) l[deep]
= i;
z[deep]
= deep + i;
y[deep]
= deep - i;
work
(deep +1)
;}}int
main()
8.子集和問題
思路:弄乙個sum,然後把元素加進去,超過c了return,等於則把它輸出,然後瘋狂return退出。
注意點:這裡要把字尾和算好,如果後面全部加起來都達不到,則也可以return。
**
#include
using
namespace std;
int n, c, a[
10001
], i, x[
10001
], j, s[
10001];
bool b[
10001
], flag;
void
work
(int deep,
int sum,
int i)
for(
; i <= n; i++)}
intmain()
廣度優先搜尋 深度優先搜尋
前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...
廣度優先搜尋,深度優先搜尋
深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...
深度優先搜尋 廣度優先搜尋
深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 package com.neusoft.data.structure 深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 public class dfsbfs 初始化 邊 mmatrix new int vlen vlen for...