10898

#include <iostream>
#include <cstdio>
#include <queue>
#include <sstream>
#include <string>
#include <cstring>
#include <cmath>

#define INF 100000000
#define ll long long

using namespace std;

int MX,cnt;
int Item,Combo,noOfOrder;
ll bestDp[1000000];
ll packPrice[1000000];
int packages[20];

void init()
{
	cnt=0;
	for(int i=0;i<1000000;i++)
	{
		bestDp[i]=INF;
		packPrice[i]=0;
	}
	for(int i=0;i<20;i++)
		packages[i]=0;
}

ll _min(ll a,ll b)
{
	if(a<b)
	return a;
	return b;
}
int isContain(int order,int packs)
{
	if(packs>order)
		return 0;
	while(order>0 && packs>0)
	{
		if(order%10 < packs%10)
			return 0;
		order/=10;
		packs/=10;
	}
	return 1;
}

int _pow(int a,int p)
{
	if(p==0)
		return 1;
	else
		return (_pow(a,p-1)*a);
}

void DP()
{
	for(int order=1;order<1000000;order++)
	{
		for(int i=0;i<cnt;i++)
		{
			if(isContain(order,packages[i]))
			{
				bestDp[order]=_min(bestDp[order],bestDp[order-packages[i]] + packPrice[packages[i]] );
			}
		}
	}
}
int main()
{
	int a,idx,multiplier,val;
	int Orders;
	while(scanf("%d",&Item)!=EOF)
	{
		init();
		for(int i=0;i<Item;i++)
		{
			idx = _pow(10,i);
			scanf("%lld",&packPrice[idx]);
			bestDp[idx]=packPrice[idx];
			packages[cnt]=idx;
			cnt+=1;
		}
		scanf("%d",&Combo);
		for(int i=0;i<Combo;i++)
		{
			 idx=0;
			 for(int j=0;j<Item;j++)
			{
				scanf("%d",&a);
				multiplier=_pow(10,j);
				a=a*multiplier;
				idx+=a;
			}
			scanf("%lld",&packPrice[idx]);
			packages[cnt]=idx;
			bestDp[idx]=_min(bestDp[idx],packPrice[idx]);
			cnt+=1;
		}
		scanf("%d",&noOfOrder);
		DP();
		for(int II=0;II<noOfOrder;II++)
		{
			val = 0;
			for(int JJ=0;JJ<Item;JJ++)
			{
				scanf("%d",&a);
				multiplier=_pow(10,JJ);
				a=a*multiplier;
				val+=a;
			}
			Orders=val;
			printf("%lld\n",bestDp[Orders]);
		}
	 }
	 return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *