farmer john最近為奶牛們的圖書館添置了乙個巨大的書架,儘管它是如此的大,但它還是幾乎瞬間就被各種各樣的書塞滿了。現在,只有書架的頂上還留有一點空間。 所有n(1 <= n <= 20)頭奶牛都有乙個確定的身高h_i(1 <= hi <= 1,000,000 - 好高的奶牛》<)。設所有奶牛身高的和為s。書架的 高度為b,並且保證1 <= b <= s。 為了夠到比最高的那頭奶牛還要高的書架頂,奶牛們不得不象演雜技一般,一頭站在另一頭的背上,疊成一座「奶牛塔」。當然,這個塔的高度,就是塔中所有奶牛的身高之和。為了往書架頂上放東西,所有奶牛的身高和必須不小於書架的高度。 塔疊得越高便越不穩定,於是奶牛們希望找到一種方案,使得疊出的塔在高度不小於書架高度的情況下,高度盡可能小。你也可以猜到你的任務了:寫乙個程式,計算奶牛們疊成的塔在滿足要求的情況下,最少要比書架高多少。
輸入格式:
第1行: 2個用空格隔開的整數:n 和 b * 第2..n+1行: 第i+1行是1個整數:h_i
輸出格式:
第1行: 輸出1個非負整數,即奶牛們疊成的塔最少比書架高的高度
輸入樣例#1:
5 16
3 1
3 5
6輸出樣例#1:
輸出說明:
我們選用奶牛1、3、4、5疊成塔,她們的總高度為3 + 3 + 5 + 6 = 17。任何方案都無法疊出高度為16的塔,於是答案為1。
這道題剛看上去可能會想到排序+貪心,後來都想到了反例,於是就想到了揹包。
題目要求我們求超過高度的最小高度,並且會保證所有奶牛的高度加起來會高過書架,那麼我們不妨換個思路,把所有的奶牛的高度相加得到sum,減去書架高度s,得到k,那麼我們要求的就是在不超過k(體積)的情況下求最大高度(價值),這是不是就變成了01揹包問題,於是問題迎刃而解。
#include
#include
using
namespace
std;
const
int maxn=100000+10;
int f[maxn],h[maxn];
int main()
int k=sum-s; //轉換思路
for(int i=1;i<=n;i++)
cout
0;}
洛谷 P2677 超級書架 2
farmer john最近為奶牛們的圖書館添置了乙個巨大的書架,儘管它是如此的大,但它還是幾乎瞬間就被各種各樣的書塞滿了。現在,只有書架的頂上還留有一點空間。所有n 1 n 20 頭奶牛都有乙個確定的身高h i 1 h i 1,000,000 好高的奶牛 設所有奶牛身高的和為s。書架的 高度為b,並...
洛谷 P2677 超級書架 2 題解
farmer john最近為奶牛們的圖書館添置了乙個巨大的書架,儘管它是如此的大,但它還是幾乎瞬間就被各種各樣的書塞滿了。現在,只有書架的頂上還留有一點空間。所有n 1 n 20 頭奶牛都有乙個確定的身高h i 1 h i 1,000,000 好高的奶牛 設所有奶牛身高的和為s。書架的 高度為b,並...
洛谷P2676 超級書架
farmer john最近為奶牛們的圖書館添置了乙個巨大的書架,儘管它是如此的大,但它還是幾乎瞬間就被各種各樣的書塞滿了。現在,只有書架的頂上還留有一點空間。所有n 1 n 20,000 頭奶牛都有乙個確定的身高h i 1 h i 10,000 設所有奶牛身高的和為s。書架的高度為b,並且保證 1 ...