題目背景
三水和小羽毛玩膩了二十四點,她們決定玩點新東西。
小羽毛給出乙個數字和以及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...