農夫約翰要量取 q(1 <= q <= 20,000)夸脫(夸脫,quarts,容積單位——譯者注) 他的最好的牛奶,並把它裝入乙個大瓶子中賣出。消費者要多少,他就給多少,從不有任何誤差。
農夫約翰總是很節約。他現在在奶牛五金商店購買一些桶,用來從他的巨大的牛奶池中量出 q 夸脫的牛奶。每個桶的**一樣。你的任務是計算出乙個農夫約翰可以購買的最少的桶的集合,使得能夠剛好用這些桶量出 q 夸脫的牛奶。另外,由於農夫約翰必須把這些桶搬回家,對於給出的兩個極小桶集合,他會選擇「更小的」乙個,即:把這兩個集合按公升序排序,比較第乙個桶,選擇第乙個桶容積較小的乙個。如果第乙個桶相同,比較第二個桶,也按上面的方法選擇。否則繼續這樣的工作,直到相比較的兩個桶不一致為止。例如,集合 比集合 要好。
為了量出牛奶,農夫約翰可以從牛奶池把桶裝滿,然後倒進瓶子。他決不把瓶子裡的牛奶倒出來或者把桶裡的牛奶倒到別處。用乙個容積為 1 夸脫的桶,農夫約翰可以只用這個桶量出所有可能的夸脫數。其它的桶的組合沒有這麼方便。 計算需要購買的最佳桶集,保證所有的測試資料都至少有乙個解。
line 1: 乙個整數 q
line 2: 乙個整數p(1 <= p <= 100),表示商店裡桶的數量
lines 3..p+2: 每行包括乙個桶的容積(1 <= 桶的容積 <= 10000)
輸出只有一行,由空格分開的整數組成:
為了量出想要的夸脫數,需要購買的最少的桶的數量,接著是:乙個排好序的列表(從小到大),表示需要購買的每個桶的容積
題解:這個題目做法有很多,可以通過對筒子取魔來知道所列舉筒子的範圍,最後加個最優性剪枝就可以了,**參考大牛們的部落格,
我是用迭代深搜,限制筒子的數目,把筒子列舉出來之後跑乙個完全揹包來check打的。**如下:
#include#include#include
#include
#include
using
namespace
std;
int dp[20010
];int tong[110
];int use[110
];bool b[110
];int q,p,flag=0
;bool judge(int
num)
} if(dp[q]==1) return1;
return0;
}void print(int
num)
}void dfs(int now,int
top)
return
; }
for(int i=1;i<=p;i++)
}int
main()
sort(tong+1,tong+p+1
);
for(int top=1;top<=p;top++)
return0;
}
#include
#include
#include
#include
#include
using
namespace
std;
intdp
[20010
];int
tong
[110
];int
use[
110];
boolb[
110];
intq,p
,flag=0
;bool
judge
(int
num)}if
(dp[q
]==1
)return1;
return0;
}void
(int
num)
}void
dfs(
intnow
,int
top)
return;}
for(
inti=1
;i<=p;
i++)
}int
main
()sort
(tong+1
,tong+p
+1);for
(int
top=1;
top<=p;
top++)
return0;
}
USACO 5 3解題報告
題目翻譯 搜尋,以桶的數量,桶的數量上限,剩餘牛奶量為參量進行搜尋。乙個桶可以使用c 剩餘牛奶量 桶的容量次,分別對使用1 c次該桶的情況進行搜尋 同時,但凡出現桶的容量大於當前答案便進行剪枝。題目翻譯 插入新視窗時,將新視窗的高度置於當前最小 置頂時,將視窗的高度置於當前最小 置底時,將視窗高度置...
USACO5 3 巨大的牛棚Big Barn
usaco 5.3.4 農夫約翰想要在他的正方形農場上建造一座正方形大牛棚。他討厭在他的農場中砍樹,想找乙個能夠讓他在空曠無樹的地方修建牛棚的地方。我們假定,他的農場劃分成 n x n 的方格。輸入資料中包括有樹的方格的列表。你的任務是計算並輸出,在他的農場中,不需要砍樹卻能夠修建的最大正方形牛棚。...
USACO 修理牛棚
同樣是一道貪心題,我的思路是用乙個陣列存下所有的空擋,對空擋進行排序,然後再在總長度中減去前m 1 大的空檔長度。關鍵還是理解題意。貌似洛谷 oj不支援 int min 之類的。還有要對初始資料排一次序,害我 wa了一次。include include includeusing namespace ...