題目描述 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次,現在要...