这是一道典型的多维背包dp,主要在于如何处理数据,其他没有难点。
(我的代码有点难看额,抱歉)
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
struct aaaa{int hao,shu;}you[100][6];
int shenqian[100];
struct bbbb{int hao,shu;}aim[6];
int you2[1000][6];
int jia[1000][2],f[6][6][6][6][6];
int s,n;
void yiwei(int wei);
void lalala(int fang);
bool flag;
int main()
{
//freopen("shopping.in","r",stdin);
//freopen("shopping.out","w",stdout);
cin>>s;
for(int i=1;i<=s;i++)
{
cin>>you[i][0].shu;
for(int j=1;j<=you[i][0].shu;j++)
{
cin>>you[i][j].hao>>you[i][j].shu;
}
cin>>you[i][0].hao;
}
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>aim[i].hao>>aim[i].shu;
cin>>jia[aim[i].hao][0];
jia[aim[i].hao][1]=i;
}
for(int i=1;i<=s;i++){
int yuanjia=0;
for(int j=1;j<=you[i][0].shu;j++)
{
yuanjia+=(jia[you[i][j].hao][0]*you[i][j].shu);
if(jia[you[i][j].hao]==0){yiwei(j);yuanjia=0;i--;break;}
}
shenqian[i]=max(shenqian[i],yuanjia-you[i][0].hao);
}
for(int i=1;i<=s;i++){
for(int j=1;j<=you[i][0].shu;j++){
you2[i][jia[you[i][j].hao][1]]=you[i][j].shu;
}
}
for(int i=1;i<=s;i++){
lalala(i);
}
int yuanjia=0;
for(int i=1;i<=n;i++){
yuanjia+=jia[aim[i].hao][0]*aim[i].shu;
}
cout<<yuanjia-f[aim[1].shu][aim[2].shu][aim[3].shu][aim[4].shu][aim[5].shu]<<endl;
return 0;
}
void yiwei(int wei)
{
for(int i=wei;i<s;i++)
swap(you[wei],you[wei+1]);
s--;
}
void lalala(int fang)
{
for(int i1=you2[fang][1];i1<=aim[1].shu;i1++)
{
for(int i2=you2[fang][2];i2<=aim[2].shu;i2++)
for(int i3=you2[fang][3];i3<=aim[3].shu;i3++)
for(int i4=you2[fang][4];i4<=aim[4].shu;i4++)
for(int i5=you2[fang][5];i5<=aim[5].shu;i5++)
{
f[i1][i2][i3][i4][i5]=max(f[i1][i2][i3][i4][i5],f[i1-you2[fang][1]][i2-you2[fang][2]][i3-you2[fang][3]][i4-you2[fang][4]][i5-you2[fang][5]]+shenqian[fang]);
}
}
}