過河(完全揹包)

2021-09-28 14:47:55 字數 2515 閱讀 9511

描述 description

farmer john以及他的n(1

<=n

<=2

,500

)n(1 <= n <= 2,500)

n(1<=n

<=2

,500

)頭奶牛打算過一條河,但他們所有的渡河工具,僅僅是乙個木筏。

由於奶牛不會划船,在整個渡河過程中,fj必須始終在木筏上。在這個基礎上,木筏上的奶牛數目每增加1,fj把木筏劃到對岸就得花更多的時間。

當fj乙個人坐在木筏上,他把木筏劃到對岸需要m(1

<=m

<

=1000

)m(1 <= m <= 1000)

m(1<=m

<=1

000)

分鐘。當木筏搭載的奶牛數目從i-1增加到i時,fj得多花mi(

1<=m

i<

=1000

)m_i(1 <= m_i <= 1000)

mi​(

1<=m

i​<=1

000)

分鐘才能把木筏劃過河(也就是說,船上有1頭奶牛時,fj得花m+m

1m+m_1

m+m1

​分鐘渡河;船上有2頭奶牛時,時間就變成m+m

1+m2

m+m_1+m_2

m+m1​+

m2​分鐘。後面的依此類推)。那麼,fj最少要花多少時間,才能把所有奶牛帶到對岸呢?當然,這個時間得包括fj乙個人把木筏從對岸劃回來接下一批的奶牛的時間。

輸入格式 input format

第1行: 2個用空格隔開的整數:n 和 m

第2…n+1行: 第i+1為1個整數:m

im_i

mi​輸出格式 output format

第1行: 輸出1個整數,為fj把所有奶牛都載過河所需的最少時間

樣例輸入 sample input

5 1034

6100

1樣例輸出 sample output

50輸入說明:

fj帶了5頭奶牛出門。如果是單獨把木筏劃過河,fj需要花10分鐘,帶上1頭奶牛的話,是13分鐘,2頭奶牛是17分鐘,3頭是23分鐘,4頭是123分鐘,將5頭一次性載過去,花費的時間是124分鐘。

輸出說明:

farmer john第一次帶3頭奶牛過河(23分鐘),然後乙個人劃回來(10分鐘),最後帶剩下的2頭奶牛一起過河(17分鐘),總共花費的時間是23+10+17 = 50分鐘。

這道題是被老師分在了完全揹包範疇內,所以我一開始就是從完全揹包的思路進行思考的,但是,我發現,我並不可以找到這道題的完全揹包的模型,之後就非常難過……

但是,我 並不想看題解,所以,我就一直在思考,皇天不負苦心人,大概在一兩個小時之後,我找到了這道題的完全揹包的思路。

思路:對於這n頭牛而言,我們可以看做是容量:我們最後的目標狀態是n頭牛都成功渡河;

之後,我們思考什麼是物品呢?? 我們可以考慮農夫如何過河一次??

農夫過河的時候可以帶0,1,2,3,4,5……,n頭牛同時過河,所以他過河一次的代價就是帶0,1,2,3,4,5……,n頭牛的代價;

之後,我們再繼續向完全揹包的思路上靠攏:我們可以讓農夫兩次過河的都帶1頭牛,也可以讓農夫3次過河的時候都帶1頭牛……,同理,也可以讓農夫帶2頭牛過河1次,2次,3次,……這樣的話,我們就可以發現:農夫帶某幾頭牛過河的次數是不受限制的。(當然可能會受到牛的數量的限制,但是這並沒有關係)

所以,我們就把農夫一次過河所帶的若干頭牛的價值作為我們的物品的容積

我們的目標是:n頭牛過河所用的最小的價值。

那麼,此時就可以看出來揹包的雛形:我們有乙個容積為n的揹包,考慮在n頭牛都過河的時候的物品的容積盡可能的小,其中每個物品的容積可以使用若干次。

#include

using

namespace std;

const

int nn=

2503

;typedef

long

long ll;

int n, t;

ll a[nn]

, f[nn]

;inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}int

main()

cout<

}

在碼**的過程**現的問題:

ce:在定義的陣列之間沒有使用「,」;

wa:

在初始化f陣列的時候,f[0]=0,因為此時當一頭牛都沒到達對岸的時候,農夫的渡河所需的最小價值應該是一次都不渡河,也就是0;

注意農夫在帶著兩船牛渡河的時候,還需要有一次的折返。

完全揹包的話,最主要的就是找到模型,以及找到什麼東西是可以使用無限次數的。

01揹包,完全揹包

動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...

(揹包二)完全揹包

public class beibaocomplete int weight int capacity 8 int value int weight int capacity 12 int result packagecomplete value,weight,capacity system.out...

揹包問題(完全揹包)

1.矩陣鏈乘法 2.投資組合問題 3.完全揹包問題 4.01揹包問題 5.最長公共子串行 乙個揹包,可以放入n種物品,物品j的重量和價值分別為,如果揹包的最大重量限制是b,怎麼樣選擇放入揹包的物品以使得揹包的總價值最大?組合優化問題,設表示裝入揹包的第j個物品的數量,解可以表示為。那麼目標函式和約束...