//F[a, b]表示有a个人,b辆车时最少的车费
//F[a, b] = min{
//F[a, b-1], //表示b辆不坐
//F[a-1, b-1]+在b车坐一个人价钱,
//F[a-2, b-1]+在b车坐2个人价钱,
//F[a-3, b-1]+在b车坐3个人价钱,
//F[a-4, b-1]+在b车坐4个人价钱
//}
//7906348 2013-03-27 22:30:13 Accepted 4526 15MS 244K 1047 B G++ chen
//dp[i][j]表示i个人j辆车的最少费用
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
struct Node{
//到达时间,空余座位
int time,z;
};
int t,n,k,d,s;
Node nd[105];
int dp[105][105];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&n,&k,&d,&s);
for(int i=1;i<=k;i++)
scanf("%d%d",&nd[i].time,&nd[i].z);
//0个人i辆车的最少费用
for(int i=1;i<=k;i++)
dp[0][i]=0;
//j个人装入i辆车初始话为INF
for(int i=0;i<=k;i++)
for(int j=1;j<=n;j++)
dp[j][i]=INF;
//对于i辆车来装n个人
for(int i=1;i<=k;i++)
for(int j=1;j<=n;j++){//对于n个人
dp[j][i]=dp[j][i-1];
for(int m=1;m<=nd[i].z;m++){//i辆车的空位
if(j-m>=0){
dp[j][i]=min(dp[j][i],dp[j-m][i-1]+d+m*nd[i].time);
}
}
}
if(dp[n][k]==INF)
printf("impossible\n");
else
printf("%d\n",dp[n][k]);
}
//system("pause");
return 0;
}
这道题目的含义其实就是,枚举第一辆车做0-4个人的情况,第二辆车做0-4个人的情况,以此类推,然后判断这些状态中的最小值。
拼车
最新推荐文章于 2023-12-04 16:23:42 发布