1. 程式人生 > >洛谷 P2677 超級書架 2

洛谷 P2677 超級書架 2

stream ring ios sticky 輸入 fff cout 頂上 高度

P2677 超級書架 2

題目描述

Farmer John最近為奶牛們的圖書館添置了一個巨大的書架,盡管它是如此的大,但它還是幾乎瞬間就被各種各樣的書塞滿了。現在,只有書架的頂上還留有一點空間。 所有N(1 <= N <= 20)頭奶牛都有一個確定的身高H_i(1 <= H_i <= 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

說明

輸出說明:

我們選用奶牛1、3、4、5疊成塔,她們的總高度為3 + 3 + 5 + 6 = 17。任何方案都無法疊出高度為16的塔,於是答案為1。

思路:正難則反,01背包

#include<cstdio>
#include
<cstring> #include<iostream> #include<algorithm> using namespace std; int n,sum,b; int num[21]; int f[2000010]; int main(){ scanf("%d%d",&n,&b); for(int i=1;i<=n;i++) scanf("%d",&num[i]),sum+=num[i]; int W=sum-b; for(int i=1;i<=n;i++)
for(int j=W;j>=num[i];j--) f[j]=max(f[j],f[j-num[i]]+num[i]); cout<<W-f[W]; }

洛谷 P2677 超級書架 2