题目:http://poj.org/problem?id=1297
分析:依次用每个在清单上的物品去更新购买清单前i个物品所需要的最小花费。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX_M 105
#define MAX_N 100005
int M, N;
int kind[MAX_M];
double f[MAX_M];
bool onList[MAX_N];
int main()
{
int i, j, K, item;
double price;
while(scanf("%d%d", &M, &N), N){
for(i = 0; i <= M; ++i) f[i] = 0.0;
memset(onList, false, sizeof(onList));
K = 1;
kind[M+1] = 0;
for(i = 1; i <= M; ++i){
scanf("%d", kind + i);
onList[kind[i]] = true;
}
for(i = 0; i < N; ++i){
scanf("%d%lf", &item, &price);
if(!onList[item]) continue;
if(item == kind[K]){
f[K] = f[K-1] + price;
++K;
}
for(j = K-1; j; --j){
if(item != kind[j]) continue;
f[j] = min(f[j], f[j-1] + price);
}
}
if(K <= M) puts("Impossible");
else printf("%.2f\n", f[M]);
}
return 0;
}