深度優先搜尋 mr353 取奶

2022-08-09 07:36:13 字數 1781 閱讀 5625

應該是usaco的題目,暫時沒有找到對應出處。

【題目大意】

農夫約翰要量取 q(1 <= q <= 20,000)夸脫(夸脫,quarts,容積單位——譯者注) 他的最好的牛奶,並把它裝入乙個大瓶子中賣出。消費者要多少,他就給多少,從不有任何誤差。

農夫約翰總是很節約。他現在在奶牛五金商店購買一些桶,用來從他的巨大的牛奶池中量出 q 夸脫的牛奶。每個桶的**一樣。你的任務是計算出乙個農夫約翰可以購買的最少的桶的集合,使得能夠剛好用這些桶量出 q 夸脫的牛奶。另外,由於農夫約翰必須把這些桶搬回家,對於給出的兩個極小桶集合,他會選擇「更小的」乙個,即:

把這兩個集合按公升序排序,比較第乙個桶,選擇第乙個桶容積較小的乙個。如果第乙個桶相同,比較第二個桶,也按上面的方法選擇。否則繼續這樣的工作,直到相比較的兩個桶不一致為止。例如,集合 比集合 要好。

為了量出牛奶,農夫約翰可以從牛奶池把桶裝滿,然後倒進瓶子。他決不把瓶子裡的牛奶倒出來或者把桶裡的牛奶倒到別處。用乙個容積為 1 夸脫的桶,農夫約翰可以只用這個桶量出所有可能的夸脫數。其它的桶的組合沒有這麼方便。計算需要購買的最佳桶集,保證所有的測試資料都至少有乙個解。

input format

line 1: 乙個整數 q

line 2: 乙個整數p(1 <= p <= 100),表示商店裡桶的數量

lines 3..p+2: 每行包括乙個桶的容積(1 <= 桶的容積 <= 10000)

output format

輸出檔案只有一行,由空格分開的整數組成:

為了量出想要的夸脫數,需要購買的最少的桶的數量,接著是:

乙個排好序的列表(從小到大),表示需要購買的每個桶的容積

sample input

sample output

2 3 5

【思路】

深搜即可,先對桶以容積大小為關鍵字進行公升序排序。對於當前狀態barrel,step,sum(取到的最新乙個桶,已經買的桶的個數,已經量取到的總容積)。每次可以選擇用已經取到的最新乙個桶繼續量取或者取容積比已有桶容積大的桶。

如果當前的桶數已經大於最小桶數,則退出;

如果當前已經達到要取的容積,且桶數小於等於最小桶數,判斷之後進行更新。

【錯誤點】

一開始我為了剪枝寫了一句if (step==minp && sum

1 #include2 #include3 #include4

using

namespace

std;

5int q,p;//

q是總容積,p是商店裡桶的數量

6const

int maxn=10000+50;7

intv[maxn],minn[maxn],now[maxn];

8int

minp,nowp; 910

intcheck()

1115

16void dfs(int barrel,int step,int sum)//

取到第幾種桶,已經買了幾個桶,已經達到的容積

1725

if (barrel!=-1 && sum+v[barrel]<=q) 26

29/*

如果當前桶還可以繼續使用,則繼續深搜

*/30

for (int i=barrel+1;i)

3140}41

}4243int

main()

44

廣度優先搜尋 深度優先搜尋

前言 這幾天複習圖論演算法,覺得bfs和dfs挺重要的,而且應用比較多,故記錄一下。廣度優先搜尋 有乙個有向圖如圖a 圖a廣度優先搜尋的策略是 從起始點開始遍歷其鄰接的節點,由此向外不斷擴散。1.假設我們以頂點0為原點進行搜尋,首先確定鄰接0的頂點集合s0 2.然後確定頂點1的集合s1 頂點2沒有鄰...

廣度優先搜尋,深度優先搜尋

深度優先搜尋 depth first search 簡稱dfs。最直觀的例子就是 走迷宮 廣度優先搜尋 每個頂點都要進出一遍佇列,每個邊也都會被訪問一次,所以 時間複雜度o v e 主要消耗記憶體的是visited prev陣列 queue佇列,所以 空間複雜度o v 深度優先搜尋 每條邊最多會被訪...

深度優先搜尋 廣度優先搜尋

深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 package com.neusoft.data.structure 深度優先搜尋 廣度優先搜尋 通過鄰接矩陣對圖進行深搜和廣搜 public class dfsbfs 初始化 邊 mmatrix new int vlen vlen for...