題面
【題目描述】
以及他的頭奶牛打算過一條河,但他們所有的渡河工具,僅僅是一個木筏。
由於奶牛不會划船,在整個渡河過程中,必須始終在木筏上。在這個基礎上,木筏上的奶牛數目每增加,把木筏劃到對岸就得花更多的時間。 當一個人坐在木筏上,他把木筏劃到對岸需要分鐘。當木筏搭載的奶牛數目從增加到時,得多花分鐘才能把木筏劃過河(也就是說,船上有頭奶牛時,得花分鐘渡河;船上有頭奶牛時,時間就變成分鐘。後面的依此類推)。那麼,最少要花多少時間,才能把所有奶牛帶到對岸呢?當然,這個時間得包括一個人把木筏從對岸劃回來接下一批的奶牛的時間。
【輸入】
第一行兩個整數數,表示頭奶牛和獨自劃到對岸的時間;
接下來個數,爲
【輸出】
一個整數,最少時間。
【樣例輸入】
5 10
3
4
6
100
1
【樣例輸出】
50
【樣例解釋】
第一次帶頭牛過河,一共花費分鐘,然後一個人劃回來,花費分鐘,最後帶剩下的頭牛過河,花費分鐘,總共分鐘。
算法分析
對於,最簡單的狀態就是問題怎麼問,怎麼設。
狀態:
——運輸頭牛過河花費的最少時間。
狀態轉移方程:
總共運輸頭牛,考慮當前這一次運輸了幾頭牛,設當前這一次運輸頭牛。數組存放.
{ },
最後的答案就是(運輸最後一次不會返回)。
時間複雜度:
參考程序
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 3000
using namespace std;
int f[N],sum[N];
int main()
{
int n,m;
cin>>n>>m;
int a;
for(int i=1;i<=n;i++)
{
cin>>a;
sum[i]=sum[i-1]+a;
}
for(int i=1;i<=n;i++)
{
int minn=N*10000;
for(int j=1;j<=i;j++) //當前這一次運輸j頭牛
minn=min(minn,f[i-j]+sum[j]+2*m);
f[i]=minn;
}
cout<<f[n]-m<<endl; //送完了就不用會來了
return 0;
}