题目要求大体是这样的:一个商店至多有五种商品,给出每种商品的编号和购买数量以及单价,然后给出几种打折方案,比如一件商品你买多件总价格会便宜一些或是你买特定的几种商品并且买特定的数量总价格也会减少。
背包问题,通过动归找到最优方案……~o( =∩ω∩= )m
代码在这:
/*poj1170shopping office*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int m,n,v;
int i,j;
int B; //商品种类数量
int c[1000]; //商品编号
int k[6]; //商品数量
int p[6]; //单品价格
int s; //优惠方案种类数量
int pay[6][6][6][6][6]; //最佳优惠方案总费用
int min(int a,int b)
{
return a>b?b:a;
}
struct VIEW
{
int q[6]; //优惠所需每种物品量
int money; //优惠组合总价格
}view[101];
int dp(int a,int b,int c,int d,int e)
{
int i;
if(a<0||b<0||c<0||d<0||e<0) return 10000000;
if(pay[a][b][c][d][e]>=0) return pay[a][b][c][d][e];
pay[a][b][c][d][e]=a*p[1]+b*p[2]+c*p[3]+d*p[4]+e*p[5];
for(i=1;i<=s;++i)
{
pay[a][b][c][d][e]=min(pay[a][b][c][d][e],view[i].money+dp(a-view[i].q[1],b-view[i].q[2],c-view[i].q[3],d-view[i].q[4],e-view[i].q[5]));
}
return pay[a][b][c][d][e];
}
int main()
{
memset(pay,-1,sizeof(pay));
scanf("%d",&B);
for(i=1;i<=B;++i)
{
scanf("%d%d%d",&n,&k[i],&p[i]);
c[n]=i;
}
scanf("%d",&s);
for(i=1;i<=s;++i)
{
scanf("%d",&v);
for(j=1;j<=v;++j)
{
scanf("%d%d",&n,&m);
view[i].q[c[n]]=m;
}
scanf("%d",&view[i].money);
}
pay[0][0][0][0][0]=0;
int res=dp(k[1],k[2],k[3],k[4],k[5]);
printf("%d\n",res);
return 0;
}