量取牛奶codevs2094

2021-08-06 06:09:41 字數 1600 閱讀 8966

題目描述 description

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

農夫約翰總是很節約。他現在在奶牛五金商店購買一些桶,用來從他的巨大的牛奶池中量出 q 夸脫的牛奶。每個桶的**一樣。你的任務是計算出乙個農夫約翰可以購買的最少的桶的集合,使得能夠剛好用這些桶量出 q 夸脫的牛奶。另外,由於農夫約翰必須把這些桶搬回家,對於給出的兩個極小桶集合,他會選擇「更小的」乙個,即:把這兩個集合按公升序排序,比較第乙個桶,選擇第乙個桶容積較小的乙個。如果第乙個桶相同,比較第二個桶,也按上面的方法選擇。否則繼續這樣的工作,直到相比較的兩個桶不一致為止。例如,集合 比集合 要好。

為了量出牛奶,農夫約翰可以從牛奶池把桶裝滿,然後倒進瓶子。他決不把瓶子裡的牛奶倒出來或者把桶裡的牛奶倒到別處。用乙個容積為 1 夸脫的桶,農夫約翰可以只用這個桶量出所有可能的夸脫數。其它的桶的組合沒有這麼方便。

計算需要購買的最佳桶集,保證所有的測試資料都至少有乙個解。

輸入描述 input description

line 1: 乙個整數 q

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

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

輸出描述 output description

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

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

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

樣例輸入 sample input

16 3

3 5

7 樣例輸出 sample output

2 3 5

資料範圍及提示 data size & hint

見描述做的第乙個dp加深搜;

子集列舉+揹包dp……;

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=40010;

int u[maxn],v[maxn],q,n,k;//u[i]指第i個選擇的在v中的下標;

bool dp[maxn];//更新答案,dp[j]=1表示可以裝到j容積的牛奶;

void print()

void check()

}void dfs(int t)

for(int i=u[t-1]+1;i<=n-(k-t);i++)//注意i的取值,n-(k-t)意思是還要給下乙個選擇留一定位置,同時也保證了公升序排列;

return;

}void solve()

int main()

USACO 5 3 1 量取牛奶

農夫約翰要量取 q 1 q 20,000 夸脫 夸脫,quarts,容積單位 譯者注 他的最好的牛奶,並把它裝入乙個大瓶子中賣出。消費者要多少,他就給多少,從不有任何誤差。農夫約翰總是很節約。他現在在奶牛五金商店購買一些桶,用來從他的巨大的牛奶池中量出 q 夸脫的牛奶。每個桶的 一樣。你的任務是計算...

codevs 1227 方格取數2

網路流 拆點 好像hdu上有類似的題。那時我還是用pascal寫的 算是裸題吧。然而我本不會費用流 看了下黃學長的 說下自己的理解 黃學長只貼了 把每乙個點拆成兩個點,乙個是流進的,乙個是流出的 然後建邊。這兩個點之間有這幾類邊 由流入點指向流出點,流量為1,費用為map i,j 由流出點指向流入點...

code vs 1227 方格取數 2

時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 題解 檢視執行結果 給出乙個n n的矩陣,每一格有乙個非負整數aij,aij 1000 現在從 1,1 出發,可以往右或者往下走,最後到達 n,n 每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要...