dp訓練 P1977 計程車拼車

2021-09-11 19:29:28 字數 1794 閱讀 3833

話說小 x 有一次去參加比賽,雖然學校離比賽地點不太遠,但小 x 還是想坐 計程車去。大學城的計程車總是比較另類,有「拼車」一說,也就是說,你乙個人 坐車去,還是一堆人一起,總共需要支付的錢是一樣的(每輛出租上除司機外最 多坐下 4 個人)。剛好那天同校的一群 oier 在校門口扎堆了,大家果斷決定拼車 去賽場。

問題來了,一輛又一輛的計程車經過,但裡面要麼坐滿了乘客,要麼只剩下 一兩個座位,眾 oier 都覺得坐上去太虧了,小 x 也是這麼想的。

假設 n 位 oier 準備拼車,此時為 0 時刻,從校門到目的地需要支付給出租

車師傅 d 元(按車次算,不管裡面坐了多少 oier),假如 s 分鐘後恰能趕上比賽,

那麼 s 分鐘後經過校門口的計程車自然可以忽略不計了。現在給出在這 s 分鐘當

中經過校門的所有的 k 輛計程車先後到達校門口的時間 t i 及裡面剩餘的座位 zi

(1 <= zi <= 4),oier 可以選擇上車幾個人(不能超過),當然,也可以選擇上 0 個

人,那就是不坐這輛車。

俗話說,時間就是金錢,這裡小 x 把每個 oier 在校門等待計程車的分鐘數 等同於花了相同多的錢(例如小 x 等待了 20 分鐘,那相當於他額外花了 20 元錢)。

在保證所有 oier 都能在比賽開始前到達比賽地點的情況下,聰明的你能計 算出他們最少需要花多少元錢麼?

輸入格式:

每組資料以四個整數 n , k , d , s 開始,具體含義參見題目描述。

接著 k 行,表示第 i 輛計程車在第 ti 分鐘到達校門,其空餘的座位數為 zi

(時間按照先後順序)。

n <= 100,k <= 100,d <= 100,s <= 100,1 <= zi <= 4,1<= t(i) <= t(i+1) <= s

輸出格式:

對於每組測試資料,輸出佔一行,如果他們所有人能在比賽前到達比賽地點,

則輸出乙個整數,代表他們最少需要花的錢(單位:元),否則請輸出「impossible」

輸入樣例#1:複製

2 2 10 5

1 12 2

輸出樣例#1:複製

14
類揹包問題(其中注意揹包也有不滿的情況,由於之前沒考慮到這個問題被卡了好久),狀態方程為 dp[i][j]=min(dp[i-1][j-l]+l*t[i]+d*(l!=0),dp[i][j])(其中dp[i][j]表示位i輛車搭載j個人所花費的最少費用)

**如下:

#include#include#include#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

using namespace std;

const int n=105;

const int inf=1e9+5;

int t[n],z[n];

int dp[n][n];

int main()

} int cnt=0;

for(int i=1;i<=k;i++)

for(int i=1;i<=k;i++)

else

dp[i][j]=min(dp[i-1][j-l]+l*t[i]+d*(l!=0),dp[i][j]);

} }} if(cntcout<<"impossible"

cout

}

P1977 計程車拼車

話說小 x 有一次去參加比賽,雖然學校離比賽地點不太遠,但小 x 還是想坐 計程車去。大學城的計程車總是比較另類,有 拼車 一說,也就是說,你乙個人 坐車去,還是一堆人一起,總共需要支付的錢是一樣的 每輛出租上除司機外最 多坐下 4 個人 剛好那天同校的一群 oier 在校門口扎堆了,大家果斷決定拼...

C語言訓練 計算1977!

題目描述 編寫乙個程式,計算1977!的值,輸入 輸出 提示 1977!的值超過計算機所能表示的整數範圍,請考慮其他技巧,假設 1977!之值不超過10000位用乙個含有10000個元素的整型陣列num表示其結果,每個元素存放一位,num 0 存入個位數,num存入十 位數,依次類推 8!40320...

專題訓練之dp

五 本專題題解 我所理解的dp,就是要求多階段的問題解 或可以轉換為多階段的問題最優解 求出每個階段的解,最終推出答案。既將大問題轉換為乙個個小問題,並將這些小問題的答案儲存下來,在解決後面的小問題或者最終的大問題時可以用到。剛開始接觸dp的時候,感覺和貪心區別不太大,兩者的寫法都基本相似 實際為貪...