1、子集問題
求n個正整數構成的乙個給定集合a = 的子集,子集的和要等於乙個給定的正整數d。請輸出所有符合條件的子集。
解題思路:
1)從原始集合中分離出乙個元素,它有兩種選擇:選擇放入接軌集合,或者不放入結果集合;
2)對於剩下的集合,重複1的動作,直到原始集合為空集,證明所有子集已經選取完成了;
/*2.排列問題求n個正整數構成的乙個給定集合a = 的全排列* * 子集問題
* @param sofar 當前原始集合還存在的數字
* @param rest 存放結果的集合 */
void recsubsets(string sofar, int
rest)
}
1)輸入串中選擇乙個加入輸出串
2)剩下的輸出串中在加乙個到輸出串;知道輸入串為空
/*子集問題和排列問題可以說是遞迴的兩個最為基礎重要的問題了,子集問題是分離重複,而排列問題是選擇重複,理解這兩個遞迴,對我們認識遞迴有很重要的作用。* * 排列問題
* @param sofar 已經被選擇的字母
* @param rest 沒有被選擇的字母 */
void recpermute(string sofar, string
rest)
} }
遞迴回溯子路簡單整理:
bool3、rpg難題有排成一行的n個方格,用紅(red)、粉(pink)、綠(green)三色塗每個格仔,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色.求全部的滿足要求的塗法.solve (configuration conf)
return
false
} }
解題思路: 子集問題
陣列 f[i] 存放i個方格有多少種塗法
n個方格可以由n-1個方格和n-2個方格填充得到
1)在一塗好的n-1個格仔裡最後再插入乙個格仔,就得到了n個格仔了。因為已經填好n-1的格仔中,每兩個格仔的顏色都不相同。所以只有1種填法。
這種情況下 f(n) 一種有f(n-1)種填法。
2)假如前面 n-2個合法 ,但是第n-1個不合法 ,即第n-1個和第乙個顏色一樣,這個時候最後乙個格仔顏色可以有2種
這種情況下f(n) 有 2*f(n-2)種填法。
所以 f(n) = f(n-1) + 2* f(n-2)
4、eof串
長度為n的字串只由 eof 組成,且o和o不相鄰,求所有滿足要求字串個數。
解題思路:
分為2種情況討論,最後是o最後不是o
把末尾是o的情況儲存在d[i][0]裡面,把最後不是o的儲存在d[i][1]裡;
在原來的字串加上 o要得到合法字串,末尾必然不為o,即d[n][0] = d[n-1][1];
在原來字串加上非o要得到合法字串,末尾隨意,即d[n][1] = d[n-1][0] + d[n-1][1];
d[1][0] = 1; d[1][1] = 2;
5.**概率
輸入資料的第一行是乙個整數c,表示測試例項的個數,然後是c 行資料,每行包含乙個整數n(1解題思路:
錯排:
n張票的所有排列可能自然是an
n = n!種排列方式,現在分析n張票排錯的情況:
如果前面n-1個人拿的都不是自己的票,即前n-1個人滿足錯排,現在又來了乙個人,他手裡拿的是自己的票。只要他把自己的票與其他n-1個人中的任意乙個交換,就可以滿足n個人的錯排。這時有n-1種方法。
如果前n-1個人不滿足錯排,而第n個人把自己的票與其中乙個人交換後恰好滿足錯排。這種情況發生在原先n-1人中,n-2個人滿足錯排,有且僅有乙個人拿的是自己的票,而第n個人恰好與他做了交換,這時候就滿足了錯排。
為前n-1個人中,每個人都有機會拿著自己的票。所以有n-1種交換的可能。
f(n) = (i - 1) * [f(n - 1) + f(n - 2)]
6.考新郎
首先,給每位新娘打扮得幾乎一模一樣,並蓋上大大的紅蓋頭隨機坐成一排;
然後,讓各位新郎尋找自己的新娘.每人只准找乙個,並且不允許多人找乙個.
假設一共有n對新婚夫婦,其中有m個新郎找錯了新娘,求發生這種情況一共有多少種可能.
方法同上,可以自己思考一下
7.折線分割平面
我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是n條折線分割平面的最大數目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。
解題思路:
假如是直線分割:n條相交的直線最多能把平面分割成幾塊。
新增第n條直線,平面最多的情況是 第n條直線與前面 n-1條直線都相交,切沒有三條直線交於一點。這樣,第n條直線一共有n-1個交點。我們知道,增加n個焦點,則增加n+1個平面。
所以 n條直線分割平面最大數是:
1 + 1 + 2 + 3 + ... + n = (n2 + n + 2) / 2
假如每次增加的不是一條直線,而是一對平行線:
當第n次新增時,前面已經有2n-2條直線了,第n次新增時,第2n-1條直線和第2n條直線各能增加2(n-1)+1個平面。所以第n次新增增加的面數是2[2(n-1) + 1] = 4n - 2 個,總面數等差數列計算 應該是1 + 4n(n+1)/2 - 2n = 2n2 + 1 。
如果,每次加進來的平行邊換成一頭相交的折線:
我們看到,平面1、3已經合為乙個面,既少了乙個面。因此,每當一組平行線相交後,就會減少乙個面。
因此,本題所要求的折線分割平面,自然就是上面求的的平行線分割平面數減去n。即 f(n) = 2n2 - n + 1;
HiveSql整理 , 習題
unix timestamp 返回當前或指定時間的時間戳 from unixtime 將時間戳轉為日期格式 current date 當前日期 current timestamp 當前的日期加時間 to date 抽取日期部分 year 獲取年 month 獲取月 day 獲取日 hour 獲取時 ...
遞迴與非遞迴習題
1.遞迴和非遞迴分別實現求第n個斐波那契數。includeint fib int n else 可以跳n節台階 是2 fib n 1 int main includeint fib int n if n 1 n 2 return 1 while a return f3 int main 2.編寫乙個...
遞迴習題練習
1.二分查詢筆試題 給定乙個排序陣列和目標陣列,在陣列找到目標值並返回其索引,如不存在陣列中,則返回他將會按順序插入的位置。class ppublic indexnode int index,boolean flag public static indexnode findval int arr,i...