usaco shopping 模拟+dp

来源:互联网 发布:薛之谦主持的网络综艺 编辑:程序博客网 时间:2024/04/30 15:30
/*ID: xujiahe1PROG: shoppingLANG: C++*/#include <vector>#include <map>#include <algorithm>#include <cstdio>#include <iostream>#include <cstring>using namespace std;#define pb(a) push_back(a);map<int,int>myp;struct node{    int g[20],num[20];    int price;}p[200];int num,m,n;int price[20];int need[20];int f[20][20][20][20][20];int i1,i2,i3,i4,i5;int get(){    int tmp=0;    tmp+=i1*price[1];    tmp+=i2*price[2];    tmp+=i3*price[3];    tmp+=i4*price[4];    tmp+=i5*price[5];    return tmp;}bool check(int k){    if(i1<p[k].g[1])        return false;    if(i2<p[k].g[2])        return false;    if(i3<p[k].g[3])        return false;    if(i4<p[k].g[4])        return false;    if(i5<p[k].g[5])        return false;    return true;}void change(int k){    if(!check(k))        return ;    int tmp=f[i1][i2][i3][i4][i5];    tmp=min(tmp,f[i1-p[k].g[1]][i2-p[k].g[2]][i3-p[k].g[3]][i4-p[k].g[4]][i5-p[k].g[5]]+p[k].price);    f[i1][i2][i3][i4][i5]=tmp;}int main(){    freopen("shopping.in","r",stdin);    freopen("shopping.out","w",stdout);    int total,a,b,c,v;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d",&total);        for(int j=1;j<=total;j++)        {            scanf("%d%d",&a,&b);            if(!myp[a])            {                num++;                myp[a]=num;            }            p[i].g[myp[a]]=b;        }        scanf("%d",&p[i].price);    }    scanf("%d",&m);    for(int i=1;i<=m;i++)    {        scanf("%d%d%d",&a,&b,&c);        if(!myp[a])        {            num++;            myp[a]=num;        }        need[myp[a]]=b;        price[myp[a]]=c;    }    for(i1=0;i1<=need[1];i1++)    {        for(i2=0;i2<=need[2];i2++)        {            for(i3=0;i3<=need[3];i3++)            {                for(i4=0;i4<=need[4];i4++)                {                    for(i5=0;i5<=need[5];i5++)                    {                        f[i1][i2][i3][i4][i5]=get();                        for(int i=1;i<=n;i++)                        {                            change(i);                        }                    }                }            }        }    }    printf("%d\n",f[need[1]][need[2]][need[3]][need[4]][need[5]]);    return 0;}

0 0
原创粉丝点击