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++ ,