如果你覺得這篇文章對你有幫助的話,請點點大拇指哦
題目描述
學校放寒假時,資訊學奧賽輔導老師有1,2,3……x本書,要分給參加培訓的x個人,每人只能選一本書,但是每人有兩本喜歡的書。老師事先讓每個人將自己喜歡的書填寫在一張表上。然後根據他們填寫的表來分配書本,希望設計乙個程式幫助老師求出所有可能的分配方案,使每個學生都滿意。
輸入格式
第1行:乙個數x
第2行第x+1行:每行兩個數,表示ai喜歡的書的序號
輸出格式
只有乙個數:總方案數total。
輸入輸出樣例
輸入
51 3
4 52 5
1 43 5
輸出
2這是一道簡單的深搜題目
我們可以將每個人夏歡的書分為一等和二等,並用乙個結構體儲存
struct like
;
這樣我們可以在安排時,優先分配一等書,檢查是否滿足條件,
不滿足條件的話在回溯到上乙個學生的選書中選擇二等書
樣例:如:
51 3
4 52 5
1 43 5
第乙個同學選擇一等書----1
此時選書陣列中的數為
第二位同學選擇一等書----4
此時選書陣列中的數為
第三位同學選擇一等書----2
此時選書陣列中的數為
到了第四位同學時,因為它所喜歡的書都被選完了,所以這種情況並不成立,我們就要回溯了,回溯到第三位同學選擇二等書,發現並不能解決這種情況,我們在回溯到第二位同學,
第二位同學選擇二等書----5
此時選書陣列中的數為
第三位同學選擇一等書----2
此時選書陣列中的數為
第四位同學選擇二等書----4
此時選書陣列中的數為
第五位同學選擇一等書----3
此時選書陣列中的數為
這樣我們就成功找到了第一種方式
當然後面還有一種方式我們就不詳細解釋了,
**如下:
#include
using
namespace std;
int n, sum =0;
struct like
;void
dfs(like a,
int i,
int b)
if(i == n)
if(b[a[i]
.one]==1
&& b[a[i]
.two]==1
)return
;//該同學喜歡的書已經被選完了
if(b[a[i]
.one]==0
)if(b[a[i]
.two]==0
)}intmain()
dfs(a,
0, b)
; cout << sum <}
洛谷 P1657 選書
學校放寒假時,資訊學奧賽輔導老師有1,2,3 x本書,要分給參加培訓的x個人,每人只能選一本書,但是每人有兩本喜歡的書。老師事先讓每個人將自己喜歡的書填寫在一張表上。然後根據他們填寫的表來分配書本,希望設計乙個程式幫助老師求出所有可能的分配方案,使每個學生都滿意。輸入格式 第1行 乙個數x 第2行 ...
洛谷 P1657 選書 dfs
時間限制 1.00s 記憶體限制 125.00mb 學校放寒假時,資訊學奧賽輔導老師有1,2,3 x本書,要分給參加培訓的x個人,每人只能選一本書,但是每人有兩本喜歡的書。老師事先讓每個人將自己喜歡的書填寫在一張表上。然後根據他們填寫的表來分配書本,希望設計乙個程式幫助老師求出所有可能的分配方案,使...
洛谷題解 P1036 選數
洛谷,已知 n 個整數 x1 x2 xn 以及1個整數k k3 7 12 22 3 7 19 29 7 12 19 38 3 12 19 34 現在,要求你計算出和為素數共有多少種。例如上例,只有一種的和為素數 3 7 19 29。鍵盤輸入,格式為 n,k 1 n 20,kx1 x2 xn 1 xi...