本來想用5個數表達一個狀態的。
但是先起來麻煩。
結果用5維數組做咯。
離散化了。 還是一次ac
Code:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
struct node
{
int p[6];
int val;
}a[1100]; int ls=0,len=0;
map<int,int>mp; int tail=0;
int b,n;
int pi[6];
void Input()
{
scanf("%d",&b); int x,y,z;
for(int i=1;i<=b;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(mp[x]==0)
mp[x]=++tail;
int k=mp[x];
pi[k]+=y;
a[++ls].p[k]++;
a[ls].val=z;
}
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int k;
scanf("%d",&k); ls++;
for(int j=1;j<=k;j++)
{
scanf("%d%d",&x,&y);
int kk=mp[x]; a[ls].p[kk]+=y;
}
scanf("%d",&z);
a[ls].val=z;
}
}
int f[6][6][6][6][6];
void Solve()
{
memset(f,63,sizeof(f));
f[0][0][0][0][0]=0;
for(int i1=0;i1<=pi[1];i1++)
{
for(int i2=0;i2<=pi[2];i2++)
{
for(int i3=0;i3<=pi[3];i3++)
{
for(int i4=0;i4<=pi[4];i4++)
{
for(int i5=0;i5<=pi[5];i5++)
{
for(int i=1;i<=ls;i++)
{
if((i1-a[i].p[1]>=0)&&(i2-a[i].p[2]>=0)&&(i3-a[i].p[3]>=0)
&&(i4-a[i].p[4]>=0)&&(i5-a[i].p[5]>=0))
{
if(f[i1-a[i].p[1]][i2-a[i].p[2]][i3-a[i].p[3]][i4-a[i].p[4]][i5-a[i].p[5]]<=9999999)
{
f[i1][i2][i3][i4][i5]=min(f[i1][i2][i3][i4][i5],
f[i1-a[i].p[1]][i2-a[i].p[2]][i3-a[i].p[3]][i4-a[i].p[4]][i5-a[i].p[5]]+a[i].val);
}
}
}
}
}
}
}
}
}
void Output()
{
printf("%d\n",f[pi[1]][pi[2]][pi[3]][pi[4]][pi[5]]);
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
Input();
Solve();
Output();
return 0;
}