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 }