题意:一辆车要求到达指定远的目标地点,一路上又一些加油站,给出加油站的位置和价格,出发时车100L汽油,要求到达目的地点也要有100L汽油。
这道题做了好久,dp[i][j]表示在第i站还有j升油的花费,状态转移是在第i站加油或不加,不加油就是上一站的对应汽油时的花费,加油的话就是min(dp[i][j], dp[i - 1][j - k + d[i] - d[i - 1]] + k * p[i])。
输入太坑了,每行都得用gets,用%d\n这样去读也错了。
代码:
/*
* Author: illuz <iilluzen[at]gmail.com>
* Blog: http://blog.csdn.net/hcbbt
* File: uva10201.cpp
* Create Date: 2013-11-17 10:18:50
* Descripton: dp
*/
#include <cstdio>
#include <cstdlib>
#define min(a, b) ((a) < (b) ? (a) : (b))
const int INF = 0x7fffffff;
int dp[110][210], d[210], p[210];
int t, n, l;
char ch[50];
int main() {
gets(ch);
sscanf(ch, "%d", &t);
gets(ch);
while (t--) {
gets(ch);
sscanf(ch, "%d", &l);
n = 0;
while (gets(ch) != NULL && ch[0] != '\0') {
n++;
sscanf(ch, "%d%d", &d[n], &p[n]);
if (d[n] > l) n--;
}
for (int i = 0; i <= n; i++)
for (int j = 0; j <= 200; j++)
dp[i][j] = INF;
dp[0][100] = 0;
for (int i = 1; i <= n; i++) {
int w = d[i] - d[i - 1];
for (int j = 0; j + w <= 200; j++)
if (dp[i - 1][j + w] != INF)
dp[i][j] = dp[i - 1][j + w];
for (int j = 0; j <= 200; j++)
for (int k = 0; k <= j; k++)
if (j - k + w <= 200 && dp[i - 1][j - k + w] != INF)
dp[i][j] = min(dp[i][j], dp[i - 1][j - k + w] + k * p[i]);
}
if (l - d[n] > 100 || dp[n][100 + l - d[n]] == INF)
puts("Impossible");
else
printf("%d\n", dp[n][100 + l - d[n]]);
if (t) puts("");
}
return 0;
}