Poj 1170 Shopping Offers dp背包

来源:互联网 发布:vb object转换 编辑:程序博客网 时间:2024/05/22 05:40

题目链接:http://poj.org/problem?id=1170

题目大意:

样例:

27 3 28 2 521 7 3 52 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;}


0 0
原创粉丝点击