您的位置:首页 > 其它

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

2013-03-27 16:04 267 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=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个人。

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

#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]
== 0x3f3f3f3f)
{
printf("impossible\n");
}
else
{
printf("%d\n",dp[k]
);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: