• Hdu 5445 Food Problem (2015长春网络赛 ACM/ICPC Asia Regional Changchun Online)


    题目链接:

      Hdu  5445 Food Problem 

    题目描述:

      有n种甜点,每种都有三个属性(能量,空间,数目),有m辆卡车,每种都有是三个属性(空间,花费,数目)。问至少运输p能量的甜点,花费最小是多少?

    解题思路:

      明显可以看出是多重背包搞两次,但是数据范围太大了,背包要到2*1e6,感觉会TLe。还是呆呆的写了一发,果断超啊!然后滚回去看背包九讲课件了,看到了二进制压缩的时候,感觉可以搞这个题目。试了一下果然AC,原本物品数目是100*100,二进制压缩以后也就是100*log2100个左右,然后进行01背包就OK咯!

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 const int INF = 0x3f3f3f3f;
     7 const int maxn = 55000;
     8 const int N = 2000;
     9 int dp[maxn], x, y, c1, c2;
    10 int dcos[N], dval[N], tcos[N], tval[N];
    11 void display ()
    12 {
    13     for (int i=0; i<c1+200; i++)
    14         dp[i] = INF;
    15     dp[0] = 0;
    16     for (int i=0; i<x; i++)
    17         for (int j=c1+200; j>=dval[i]; j--)
    18             dp[j] = min (dp[j], dp[j-dval[i]]+dcos[i]);
    19     c2 = dp[c1];
    20     for (int i=c1; i<c1+200; i++)
    21         c2 = min (dp[i], c2);
    22 }
    23 void solve ()
    24 {
    25     memset (dp, 0, sizeof(dp));
    26     for (int i=0; i<y; i++)
    27         for (int j=50000; j>=tcos[i]; j--)
    28             dp[j] = max (dp[j], dp[j-tcos[i]]+tval[i]);
    29     for (int i=1; i<=50000; i++)
    30         if (dp[i] >= c2)
    31         {
    32             printf ("%d
    ", i);
    33             return ;
    34         }
    35     printf ("TAT
    ");
    36 }
    37 int main ()
    38 {
    39     int t, n, m;
    40     scanf ("%d", &t);
    41     while (t --)
    42     {
    43         scanf ("%d %d %d", &n, &m, &c1);
    44         int a, b, c;
    45         x = y = 0;
    46         for (int i=0; i<n; i++)
    47         {
    48             scanf ("%d %d %d", &a, &b, &c);
    49             for (int k=1; c; k*=2)
    50             {
    51                 int num = min (k, c);
    52                 dcos[x] = num * b;
    53                 dval[x++] = num * a;
    54                 c -= num;
    55             }
    56         }
    57         for (int i=0; i<m; i++)
    58         {
    59             scanf ("%d %d %d", &a, &b, &c);
    60             for (int k=1; c; k*=2)
    61             {
    62                 int num = min (k, c);
    63                 tcos[y] = num * b;
    64                 tval[y++] = num * a;
    65                 c -= num;
    66             }
    67         }
    68         display ();
    69         solve ();
    70     }
    71     return 0;
    72 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    面向对象三大特性之多态
    作业
    面向对象三大特性之封装
    面向对象三大特性之继承
    面向对象(一)
    subprocess, re模块,logging, 包等使用方法
    模块二之序列化模块以及collections模块
    常用模块
    内置函数补充,函数递归,模块
    生成器以及面向过程编程
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4813903.html
Copyright © 2020-2023  润新知