• 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
    ",d[v]);
    75     }
    76     return 0;
    77 }
  • 相关阅读:
    电脑无法删除文件提示源路径太长怎么办|电脑由于文件名太长无法删除的解决方法
    史上最清晰的红黑树讲解(上)
    深入理解Java PriorityQueue
    为什么你的博客不够火?
    Java ArrayDeque源码剖析
    Java LinkedList源码剖析
    Java HashSet和HashMap源码剖析
    Java ArrayList源码剖析
    Java Collections Framework概览
    顺序对齐
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7229919.html
Copyright © 2020-2023  润新知