题目链接:http://poj.org/problem?id=1170
题目大意:
样例:
2 7 3 2 8 2 5 2 1 7 3 5 2 7 1 8 2 10商店有两种商品,编号为7的商品 要买3件,每件单价为2;编号为8的商品 要买2件,每件单价为5;现在有两种组合优惠,第一种优惠由一种商品组成,即买3件7号物品共5元;第二种优惠由两种商品组成,即买1件7号物品和2件8号物品共10元,(不允许多买)问最小的花费为多少?
解题思路:把每种商品单独看成一个组合,把组合商品看成一个组合,即变成多重背包问题。最多有五类产品,每类最多有五个。
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int d[6][6][6][6][6],p[100][1000],num[100],reduce[100];
struct product
{
int c,k,r;
}a[6];
int main()
{
int s,n,a1,a2,a3,a4,a5;
while(~scanf("%d",&n))
{
memset(p,0,sizeof(p));
for(int i=1;i<=n;i++)
scanf("%d%d%d",&a[i].c,&a[i].k,&a[i].r);
scanf("%d",&s);
for(int i=1;i<=s;i++)
{
scanf("%d",&num[i]);
for(int j=1;j<=num[i];j++)
{
scanf("%d%d",&a1,&a2);
p[i][a1]=a2;//第i种组合中a1商品的数量为a2;
}
scanf("%d",&reduce[i]);
}
d[0][0][0][0][0]=0;
for(a1=0;a1<=a[1].k;a1++)
for(a2=0;a2<=a[2].k;a2++)
for(a3=0;a3<=a[3].k;a3++)
for(a4=0;a4<=a[4].k;a4++)
for(a5=0;a5<=a[5].k;a5++)
{
d[a1][a2][a3][a4][a5]=a1*a[1].r+a2*a[2].r+a3*a[3].r+a4*a[4].r+a5*a[5].r;
for(int i=1;i<=s;i++)//遍历每种特价组合
{
if(num[i]>n) continue;
int b1=a1-p[i][a[1].c];
int b2=a2-p[i][a[2].c];
int b3=a3-p[i][a[3].c];
int b4=a4-p[i][a[4].c];
int b5=a5-p[i][a[5].c];
if(b1<0||b2<0||b3<0||b4<0||b5<0) continue;
d[a1][a2][a3][a4][a5]=min(d[a1][a2][a3][a4][a5],d[b1][b2][b3][b4][b5]+reduce[i]);
}
}
printf("%d\n",d[a[1].k][a[2].k][a[3].k][a[4].k][a[5].k]);
}
return 0;
}