Poj 1170 题解

来源:互联网 发布:stm32f030编程手册 编辑:程序博客网 时间:2024/06/17 16:49

本来想用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;}



0 0