威威貓系列故事——拼車記
Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1124 Accepted Submission(s): 350
問題來了,一輛又一輛的出租車經過,但裏面要麼坐滿了乘客,要麼只剩下一兩個座位,衆Acmer都覺得坐上去太虧了,威威貓也是這麼想的。
假設N名Acmer準備拼車,此時爲0時刻,從校門到目的地需要支付給出租車師傅D元(按車次算,不管裏面坐了多少Acmer),假如S分鐘後恰能趕上比賽,那麼S分鐘後經過校門口的出租車自然可以忽略不計了。現在給出在這S分鐘當中經過校門的所有的K輛出租車先後到達校門口的時間Ti 及裏面剩餘的座位Zi (1 <= Zi <= 4),Acmer可以選擇上車幾個人(不能超過),當然,也可以選擇上0個人,那就是不坐這輛車。
俗話說,時間就是金錢,這裏威威貓把每個Acmer在校門等待出租車的分鐘數等同於花了相同多的錢(例如威威貓等待了20分鐘,那相當於他額外花了20元錢)。
在保證所有Acmer都能在比賽開始前到達比賽地點的情況下,聰明的你能計算出他們最少需要花多少元錢麼?
[Technical Specification]
T <= 50
N <= 100
K <= 100
D <= 100
S <= 100
1 <= Zi <= 4
1<= T(i) <= T(i+1) <= S
#include<stdio.h>
#include<string.h>
#define N 1000000
int dp[120][120],c[120];
int n,d,k,s;
int min(int a,int b)
{
return a>b?b:a;
}
int main()
{
int t,i,j,x,y,l;
scanf("%d",&t);
while(t--)
{
memset(c,0,sizeof c);
scanf("%d%d%d%d",&n,&k,&d,&s);
memset(dp,N,sizeof dp);
dp[0][0]=0;
for(i=1;i<=k;i++)
{
for(j=0;j<=n;j++)
dp[i][j]=dp[i-1][j];
scanf("%d%d",&x,&y);
for(j=0;j<=n;j++)
{
for(l=0;l<=y;l++)
if(j>=l)
dp[i][j]=min(dp[i-1][j-l]+l*x+d,dp[i][j]);
}
}
if(dp[k][n]<N)
printf("%d\n",dp[k][n]);
else
printf("impossible\n");
}
return 0;
}