POJ 1170 Shopping Offers(完全背包+哈希)

http://poj.org/problem?id=1170

题意:
有n种花的数量和价格,以及m种套餐买法(套餐会便宜些),问最少要花多少钱。

 

思路:
题目是完全背包,但这道题目不好处理的是套餐的状态,因为数量最多只有5,所有可以用6进制来记录状态。

最后的话就是一个完全背包啦~

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<sstream>
 6 #include<vector>
 7 #include<stack>
 8 #include<queue>
 9 #include<cmath>
10 #include<map>
11 #include<set>
12 using namespace std;
13 typedef long long ll;
14 typedef pair<int,int> pll;
15 const int INF = 0x3f3f3f3f;
16 const int maxn = 1e4 + 5;
17 
18 int n, m;
19 int v;
20 
21 struct node
22 {
23     int code, st, num, price;
24 }a[maxn];
25 
26 map<int,int> ID;
27 
28 int d[maxn];
29 
30 int main()
31 {
32     //freopen("in.txt","r",stdin);
33     while(~scanf("%d",&n))
34     {
35         v=0;
36         ID.clear();
37 
38         for(int i=0;i<n;i++)
39         {
40             scanf("%d%d%d",&a[i].code,&a[i].num,&a[i].price);
41             a[i].st=pow(6.0,(double)i);
42             v+=a[i].st*a[i].num;
43             ID[a[i].code]=i;
44         }
45 
46         scanf("%d",&m);
47         for(int i=0;i<m;i++)
48         {
49             int t;
50             scanf("%d",&t);
51             a[i+n].st=0;
52             while(t--)
53             {
54                 int code, num;
55                 scanf("%d%d",&code,&num);
56                 if(ID.find(code)==ID.end())  continue;
57                 a[i+n].st+=a[ID[code]].st*num;
58             }
59             scanf("%d",&a[i+n].price);
60         }
61 
62         for(int i=0;i<=v;i++)
63             d[i]=INF;
64         d[0]=0;
65 
66 
67         for(int i=0;i<n+m;i++)
68         {
69             for(int j=a[i].st;j<=v;j++)
70             {
71                 d[j]=min(d[j],d[j-a[i].st]+a[i].price);
72             }
73         }
74         printf("%d\n",d[v]);
75     }
76     return 0;
77 }

 

posted @ 2017-07-24 17:04  Kayden_Cheung  阅读(427)  评论(0编辑  收藏  举报
//目录