Shopping Offers POJ - 1170
题意:先输入b;表示一共有b个商品;接下来b行,个三个数c,k,p;代表商品的名称,需买的商品数,单个商品的价格;
然后输入s,代表有s种优惠;接下来s行,先一个数n,代表n个商品,然后n个(c,k)对,代表c的商品买k件,最后输入price,代表此类优惠的价格;
因为最多五种商品,数据不大,就可以6个循环(五种商品加优惠方案)枚举每种情况暴力求解;
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int kind[6];
int num[6];
int price[6];
int arr[1001][1001];
int pr[6];
int mp[6][6][6][6][6];
int main()
{
int b;
while(cin>>b)
{
memset(num,0,sizeof(num));
memset(mp,0,sizeof(mp));
for(int i=1;i<=b;i++)
{
scanf("%d%d%d",&kind[i],&num[i],&price[i]);
}
int s;
scanf("%d",&s);
for(int i=1;i<=s;i++)
{
int n;
scanf("%d",&n);
for(int j=1;j<=n;j++)
{
int c,k,a;
scanf("%d%d",&c,&k);
for(a=1;a<=b;a++)
{
if(kind[a]==c)
break;
}
arr[i][a]=k;
}
scanf("%d",&pr[i]);
}
for(int i=0;i<=num[1];i++)
{
for(int j=0;j<=num[2];j++)
{
for(int k=0;k<=num[3];k++)
{
for(int l=0;l<=num[4];l++)
{
for(int m=0;m<=num[5];m++)
{
int ans=1001001,sum;
for(int q=1;q<=s;q++)
{
if(i>=arr[q][1]&&j>=arr[q][2]&&k>=arr[q][3]&&l>=arr[q][4]&&m>=arr[q][5])
{
sum=mp[i-arr[q][1]][j-arr[q][2]][k-arr[q][3]][l-arr[q][4]][m-arr[q][5]]+pr[q];
if(sum<ans)
ans=sum;
}
}
if(ans==1001001)
mp[i][j][k][l][m]=i*price[1]+j*price[2]+k*price[3]+l*price[4]+m*price[5];
else
mp[i][j][k][l][m]=ans;
}
}
}
}
}
printf("%d\n",mp[num[1]][num[2]][num[3]][num[4]][num[5]]);
}
}