暴搜輸出可行解

2021-10-07 22:39:24 字數 2058 閱讀 9671

題目背景

三水和小羽毛玩膩了二十四點,她們決定玩點新東西。

小羽毛給出乙個數字和以及n

nn個數字,由三水給出這n

nn個數字計算得出這個數字和的可能。

由於這是乙個新遊戲,為了不讓三水花太多的時間,兩人約定只做加法。

題目描述

小羽毛給出乙個數字和sum

(sum

≤1000

)sum(sum≤1000)

sum(su

m≤10

00)。

隨後給出n(n

≤25

)n(n≤25)

n(n≤25

)個數字的值,由三水從這n

nn個數字中任意選取(同乙個數字只能選取一次)若干,使其和恰好等於sum

sumsu

m 輸入格式

第一行是兩個數字:數字和sum

sumsu

m以及可供三水挑選的數字數量nnn

第二行有n

nn個正整數a

ia_i

ai​輸出格式

輸出可能的方案,多個方案則按照字典序輸出,每個方案佔一行

最後一行輸出所有的可行方案總數

樣例一輸入

331

11

輸出

123

1

樣例二

輸入

554

1231

輸出

121

5245

344

提示說明

s um

≤1000

sum≤1000

sum≤10

00,n

nn≤25

題解看上去是乙個01揹包,但是emmm這題用dp俺不會做(因為dp回溯只能解出乙個最優解。。有沒有更好的方法俺也不知道。。。)

因為需要輸出所有解,所以這題我用的dfs暴搜+剪枝

陣列a儲存所有數字的值,陣列v標記某個數字是否選中,tol表示搜尋進行到當前情況,已經選中的數字和。

剪枝策略:若當前的數字和tol已經大於目標值sum,剪枝。若當前數字已經全部遍歷完則返回。

每次對第k個數字進行選,還是不選的抉擇。

如果選中,則v[k]=1標記選中,然後遞迴dfs(k+1, tol + a[k])

如果不選,則v[k]=0標記不選,然後遞迴dfs(k+1, tol)

注意暴搜的時候,先搜當前數字「選中」的情況,再搜當前數字「不選」的情況。以達到「多個方案按照字典序輸出」的目的

標程

#include

using namespace std;

const

int n =30;

int a[n]

, v[n]

;int sum, n, res =0;

void

printplan()

void

dfs(

int k,

int tol)

if(k > n)

//剪枝

return;if

(tol > sum)

//剪枝

return

; v[k]=1

;//注意先「選擇」這個數字

dfs(k +

1, tol + a[k]);

v[k]=0

;//後「不選」這個數字,以達到字典序輸出

dfs(k +

1, tol);}

intmain()

迷宮問題BFS暴搜

首先宣告的是這個問題的 並不是本人所做,我只是抱著學習的態度,在此標記如下 迷宮 題 從圖左邊入口處的2011進去,在迷宮裡轉悠,最後變成2012從右邊出來。可以在迷宮裡轉圈,可以重複之前走過的路,但不能回退。include include include define startvalue 201...

搞不懂的暴搜

暴搜優化.分析 令第 i 種裝備的數量為sum i 顯然如果 sum i 不為 0 那麼這種裝備必選一件,在這時需要考慮的總方案數為 max sum i 1 其中 sum i 50。最壞情況下所有 sum 的值都相同,令它們都等於 k,則方案數為 kn k 當 k 取 3 時取到最大值 3n 3 在...

通過暴搜DRIVER OBJECT列舉驅動

作 者 gjden 時 間 2010 03 30,00 12 20 鏈 接 通過暴搜driver object列舉驅動 0x002 size int2b 0x004 deviceobject ptr32 device object 0x008 flags uint4b 0x00c driversta...