当前位置:编程学习 > C/C++ >>

Hdu 4526 威威猫系列故事——拼车记

DP题。

dp[i][j]表示前i辆车送走j个人的最小花费。

状态转移方程是: dp[i][j] = min(dp[i][j],dp[i-1][j-p] + p*t[i] + d),其中0<=p<=z[i]。p代表第i辆车送走p个人。

细节部分和边界条件看代码。


[cpp]
#include <iostream>  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <math.h>  
#include <algorithm>  
#include <stack>  
#include <queue>  
using namespace std; 
 
int t[105]; 
int z[105]; 
//dp[i][j]表示前i辆车送走j个人的最小花费  
int dp[105][105]; 
 
int main() 

#ifndef ONLINE_JUDGE  
    freopen("in.txt","r",stdin); 
#endif  
    int cas; 
    scanf(" %d",&cas); 
    while(cas--) 
    { 
        memset(dp,0x3f3f3f3f,sizeof(dp)); 
        memset(t,0,sizeof(t)); 
        memset(z,0,sizeof(z)); 
 
        int n,k,d,s; 
        scanf(" %d %d %d %d",&n,&k,&d,&s); 
        dp[0][0] = 0;//注意0辆车0个人是0而不是inf  
        for(int i=1;i<=k;i++) 
        { 
            dp[i][0] = 0; 
            scanf(" %d %d",&t[i],&z[i]); 
        } 
        //第i辆车  
        for(int i=1;i<=k;i++) 
        { 
            //前i辆车一共送走j个人  
            for(int j=1;j<=n;j++) 
            { 
                //其中第i辆车送走p个人  
                for(int p=0;p<=z[i];p++) 
                { 
                    //前i-1辆车送走的人数  
                    int temp = (j>p) ? (j-p) : 0; 
                    int price = (p == 0) ? 0 : d; 
                    dp[i][j] = min(dp[i][j],dp[i-1][temp] + p*t[i] + price); 
                } 
            } 
        } 
        if(dp[k][n] == 0x3f3f3f3f) 
        { 
            printf("impossible\n"); 
        } 
        else 
        { 
            printf("%d\n",dp[k][n]); 
        } 
    } 
    return 0; 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,