五维DP,蛋碎了,,很久不写题解的我也想记下这段优美的代码了
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 1000
using namespace std;
int code[6]; //each item's code
int dcode[maxn]; //dcode[code]=index
int num[6]; //each item's number
int price[6]; //each item's price
int sale_item_number[110][6]; //each item's number in every special offer
int sale_count[110],sale_price[110]; //each special offer's item number and special cost
int n; //tot item in basket
int pn; //the number of special offer
int dp[6][6][6][6][6]; //dp array ,what you understand;
void init()
{
int coode,idx;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>code[i]>>num[i]>>price[i];
dcode[code[i]]=i;
}
cin>>pn;
memset(sale_item_number,0,sizeof(sale_item_number));
for(int i=0;i<pn;i++)
{
cin>>sale_count[i];
for(int j=0;j<sale_count[i];j++)
{
cin>>coode;idx=dcode[coode];
cin>>sale_item_number[i][idx];
}
cin>>sale_price[i];
}
}
void solve()
{
memset(dp,-1,sizeof(dp));
int i0,i1,i2,i3,i4;
int i,j;
int & aim=dp[num[0]][num[1]][num[2]][num[3]][num[4]];
aim=0;
for(i=0;i<5;i++)
{
aim+=num[i]*price[i];
}
dp[0][0][0][0][0]=0;
for(i0=0;i0<=num[0];i0++)
{
for(i1=0;i1<=num[1];i1++)
{
for(i2=0;i2<=num[2];i2++)
{
for(i3=0;i3<=num[3];i3++)
{
for(i4=0;i4<=num[4];i4++)
{
for(i=0;i<=pn;i++)
{
int & uv =dp[i0][i1][i2][i3][i4];
if(sale_item_number[i][0]>i0||
sale_item_number[i][1]>i1||
sale_item_number[i][2]>i2||
sale_item_number[i][3]>i3||
sale_item_number[i][4]>i4
)continue;
int bg= dp[i0-sale_item_number[i][0]]
[i1-sale_item_number[i][1]]
[i2-sale_item_number[i][2]]
[i3-sale_item_number[i][3]]
[i4-sale_item_number[i][4]];
if(bg<0)continue;
int temp=sale_price[i]+bg;
if(uv==-1||temp<uv)
{
uv=temp;
int res=uv+(num[0]-i0)*price[0]+
(num[1]-i1)*price[1]+
(num[2]-i2)*price[2]+
(num[3]-i3)*price[3]+
(num[4]-i4)*price[4];
if(aim==-1||res<aim)
{
aim=res;
}
}
}
}
}
}
}
}
printf("%d\n",aim);
}
int main()
{
freopen("1170.txt","r",stdin);
init();
solve();
return 0;
}