拼车

来源:互联网 发布:地产知识软件 编辑:程序博客网 时间:2024/05/17 00:15
//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个人价钱 //}//79063482013-03-27 22:30:13Accepted452615MS244K1047 BG++chen//dp[i][j]表示i个人j辆车的最少费用 #include<stdio.h>#include<stdlib.h>#include<algorithm>using namespace std;#define INF 0x3f3f3f3fstruct 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");elseprintf("%d\n",dp[n][k]);}//system("pause");    return 0;}
这道题目的含义其实就是,枚举第一辆车做0-4个人的情况,第二辆车做0-4个人的情况,以此类推,然后判断这些状态中的最小值。