一.分治
分治是一種思想,可以用遞迴的方法實現,也可以用非遞迴的方法實現;
二.遞迴
自底向上:
三.題目
1.全排列:
方法一:
#include
using
namespace std ;
int n , p[11]
;void
generatep
(int index)
else}if
(t ==0)
}}}int
main()
方法二:
將一重迴圈換成雜湊表;
#include
const
int maxn =11;
int n , p[maxn]
, hashtable[maxn]=;
void
generatep
(int index)
for(
int i =
1; i <= n ; i ++)}
}int
main()
注意:
已經有全域性變數n,則不能在mian裡定義乙個int n;
2.八妃問題
方法一:
全排列,剔除不滿足條件的;如何檢查是否有在同一對角線的皇后:行數差 = 列數差(行數:陣列下標,列數:陣列值);
#include
#include
using
namespace std ;
const
int maxn =
100;
int cnt , n , p[maxn]
;bool hashtable[maxn]=;
void
generatep
(int index)}if
(flag ==
1) cnt ++;}
for(
int i =
0; i < n ; i ++)}
}int
main()
方法二:回溯法
思路:選出 index 可以放置的位置;
注意:1).遍歷上層選 index 的位置時,要利用 flag 排除不可能的位置(而不是選滿足條件的位置);
2).遞迴式後不用恢復初始化p[maxn];
**:
#include
#include
#include
using
namespace std ;
const
int maxn =
100;
int cnt , n ;
int p[maxn]
;void
generatep
(int index)}if
(flag ==1)
generatep
(index +1)
;}}}
intmain()
3.《演算法競賽入門經典》7-4
**:
#include
#include
using
namespace std ;
const
int maxn =20;
int n , p[maxn]
;int hashtable[maxn]=;
intprime
(int a)
return flag ;
}void
print_ring
(int index)
else}}
}int
main()
演算法筆記 4 3 遞迴
三.回溯 2.字母全排列 3.數樓梯 總時間限制 1000ms 記憶體限制 65536kb 描述逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式2 3的逆波蘭表示法為 2 3。逆波蘭表示式的優點是運算子之間不必有優先順序關係,也不必用括號改變運算次序,例如 2 3 4的逆波蘭表示法為 2...
演算法筆記4 3遞迴 問題 A 吃糖果
問題 a 吃糖果 題目描述 名名的媽媽從外地出差回來,帶了一盒好吃又精美的巧克力給名名 盒內共有 n 塊巧克力,20 n 0 媽媽告訴名名每天可以吃一塊或者兩塊巧克力。假設名名每天都吃巧克力,問名名共有多少種不同的吃完巧克力的方案。例如 如果n 1,則名名第1天就吃掉它,共有1種方案 如果n 2,則...
演算法筆記4 3遞迴 神奇的口袋
有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john...