P1657 選書洛谷c 題解

2021-10-09 23:34:51 字數 1557 閱讀 9809

如果你覺得這篇文章對你有幫助的話,請點點大拇指哦

題目描述

學校放寒假時,資訊學奧賽輔導老師有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...