题目的意思就是你要从起点开车到终点去,每开一公里消耗1L的油,你刚开始有100L油.油箱最多200L;
然后给出沿途哪些地点有加油站,这些地点1L油的价格.(起点和终点都不加油.
问到达终点时,油箱里要剩100L油 的最小花费...
首先我们用f[i][j] 代表在第 i 个站点. 剩下 j L油的最小花费
那么我们可以得到状态转移方程
f[i][j] = min{f[i][j],f[i - 1][j + (s[i].d - s[i - 1].d) - k] + s[i].m * k};
也就是你在这一站加了k L油 ,还剩下j L 那么你在上一站应该剩下j + (s[i].d - s[i - 1].d) - k,(上一站剩下的油减掉两站之间的距离,再加上另外加的k L 等于j L) 枚举加油的多少 来找最优值.
AC代码;
#include <stdio.h>
#include <string.h>
const int N = 205;
const int INF = 0x3f3f3f3f;
struct station {
int d;
int c;
}s[N];
int len;
int n;
int f[N][N];
char str[N];
int main() {
int t;
scanf("%d", &t);
while (t--) {
n = 1;
scanf("%d", &len);
getchar();
while (gets(str)) {
if(str[0] == '\0')
break;
sscanf(str, "%d%d", &s[n].d, &s[n].c);
n++;
}
n--;
memset(f, INF, sizeof(f));
f[0][100] = 0;
for (int i = 1; i <= n; i++) {
int lenn = s[i].d - s[i - 1].d;
for (int j = 0; j <= 200; j++)
for (int k = 0; k <= j; k++)
if (j + lenn - k <= 200 && f[i - 1][j + lenn - k] != INF && f[i][j] > f[i - 1][j + lenn - k] + s[i].c * k)
f[i][j] = f[i - 1][j + lenn - k] + s[i].c * k;
}
if (len - s[n].d > 100 || f[n][len - s[n].d + 100] == INF)
printf("Impossible\n");
else
printf("%d\n", f[n][len - s[n].d + 100]);
if (t)
printf("\n");
}
return 0;
}