http://acm.hdu.edu.cn/showproblem.php?pid=5445

题意:
现在你要为运动会提供食物,总共需要提供P能量的食物,现在有n种食物,每种食物能提供 t 能量,体积为 u ,并且最多能提供 v 的数量。运载食物的卡车有m种,每种能提供 x 的运输空间,运输花费为 y,最多可以雇佣 z 辆车。食物可以切割后运输。不需要整块一起运输,但只有一整块全部到达时才能提供能量。

现在需要计算出最少需要多少花费。

思路:

因为食物可以切割运输,那么食物的总体积肯定是越小越好,所以先用多重背包计算出提供P能量所需的最少食物体积,食物的能量最多能提供100,所以背包容量到P+100即可。

有了体积之后,接下来只需要计算运输这些体积的食物最少需要多少花费,再用一次多重背包即可。

需要使用二进制优化。

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF = 0x3f3f3f3f; int n,m,p,tot;
int val[],cost[];
int dp[]; int solve1()
{
for(int i=;i<=p+;i++) dp[i] = INF;
dp[] = ;
for(int i=;i<tot;i++)
for(int j=p+;j>=val[i];j--)
dp[j] = min(dp[j],dp[j-val[i]]+cost[i]);
int ans = INF;
for(int i=p;i<=p+;i++)
ans = min(ans, dp[i]);
return ans;
} int solve2(int v)
{
memset(dp,,sizeof dp);
for(int i=;i<tot;i++)
for(int j=;j>=cost[i];j--)
dp[j] = max(dp[j],dp[j-cost[i]]+val[i]);
for(int i=;i<=;i++)
if(dp[i]>=v) return i;
return INF;
} int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&p);
tot = ;
for(int i=;i<=n;i++)
{
int t,u,v;
scanf("%d%d%d",&t,&u,&v);
for(int k=;v;k<<=)
{
int num = min(k,v);
val[tot] = num*t;
cost[tot++] = num*u;
v -= num;
}
}
int v = solve1();
tot = ;
for(int i=;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
for(int k=;z;k<<=)
{
int num = min(k,z);
cost[tot] = num*y;
val[tot++] = num*x;
z -= num;
}
}
if(v==INF) {puts("TAT");continue;}
int ans = solve2(v);
if(ans==INF) puts("TAT");
else printf("%d\n",ans);
}
return ;
}

HDU 5445 Food Problem(多重背包+二进制优化)的更多相关文章

  1. HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

  2. HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)

    HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...

  3. hdu 5445 Food Problem 多重背包

    Food Problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5 ...

  4. HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)

    HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的 ...

  5. hdu1059 dp(多重背包二进制优化)

    hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听 ...

  6. hdu 2191 (多重背包+二进制优化)

    Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...

  7. HDU 1171 Big Event in HDU 多重背包二进制优化

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Jav ...

  8. hdu 1171 Big Event in HDU(多重背包+二进制优化)

    题目链接:hdu1171 思路:将多重背包转为成完全背包和01背包问题,转化为01背包是用二进制思想,即件数amount用分解成若干个件数的集合,这里面数字可以组合成任意小于等于amount的件数 比 ...

  9. hdu 2844 Coins (多重背包+二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...

随机推荐

  1. Autel MaxiSYS PRO MS908P Diagnostic System with Wireless VCI J-2534

    You’re a professional mechanic, an enthusiast or and mechanic shop owner? Then you are here on the r ...

  2. ORCAl存储过程

    1.存储过程结构 1.1 第一个存储过程 create or replace procedure proc1( para1 varchar2, para2 out varchar2, para3 in ...

  3. CentOS下shell显示-bash-4.1$不显示用户名路径

    Linux CentOS下shell显示-bash-4.1$不显示用户名路径的解决方法. 问题描述: CentOS下新增一个用户,登录进去之后shell脚本的信息如下: -bash-4.1$ \ -b ...

  4. TensorFlow for distributed

    TensorFlow for distributed 本目录包括了运行时分布式TensorFlow的实现,其底层使用了gRPC 作为进程内通信的支持库. Quick start 首先,需要构建一个Te ...

  5. 前端框架VUE----cli脚手架(框架)

    一.创建vue项目 npm install vue-cli -g #-g全局 (sudo)npm install vue-cli -g #mac笔记本 vue-init webpack myvue # ...

  6. 怎样从外网访问内网php-fpm?

    本地安装了一个php-fpm,只能在局域网内访问,怎样从外网也能访问到本地的php-fpm呢?本文将介绍具体的实现步骤. 准备工作 安装并启动php-fpm 默认安装的php-fpm端口是9000. ...

  7. Qt发布可执行程序

    在Qt Creator下用release跑一遍程序,生成相应的EXE文件.   在Qt Creator下编译好的release下的 youProgramName.exe 拷贝到一个文件夹下面:   在 ...

  8. ZYNQ跑系统 系列(二) petalinux方式移植linux petalinux-config遇到问题

    petalinux-config --get-hw-description=. 报错 [INFO] sourcing bitbakeERROR: Failed to source bitbakeERR ...

  9. 状态管理之cookie使用及其限制、session会话

    # 1.什么是状态管理? 将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来.(cookie浏览器所涉及到的访问数据保存下来)# 2.如何进行状态管理? ...

  10. 在linux系统中安装redis

    使用的工具是 连接上虚拟机,进入安装文件的目录 进入redis压缩包中 将压缩包解压: tar -zxvf redis-2.8.3.tar.gz 进入这个文件中:  cd redis-2.8.3 进入 ...