题意:一堆食物,有价值、空间、数量三种属性,一些卡车,有空间,价格,数量三种属性。求最少的钱(不超过50000)买卡车装下价值大于等于给定价值的食物,食物可以拆开来放

思路:这题的关键是给定的条件:食物可以拆开来放。这个条件使得卡车和食物可以分开考虑,然后通过空间这个属性联系在一起。做两遍多重背包即可。

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#pragma comment(linker, "/STACK:10240000")
#include <bits/stdc++.h>
using namespace std; #define X first
#define Y second
#define pb push_back
#define mp make_pair
#define all(a) (a).begin(), (a).end()
#define fillchar(a, x) memset(a, x, sizeof(a)) typedef long long ll;
typedef pair<int, int> pii; namespace Debug {
void print(){cout<<endl;}template<typename T>
void print(const T t){cout<<t<<endl;}template<typename F,typename...R>
void print(const F f,const R...r){cout<<f<<" ";print(r...);}template<typename T>
void print(T*p, T*q){int d=p<q?:-;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}
}
template<typename T>bool umax(T&a, const T&b){return b<=a?false:(a=b,true);}
template<typename T>bool umin(T&a, const T&b){return b>=a?false:(a=b,true);}
/* -------------------------------------------------------------------------------- */ int dp[]; void zeroPack_min(int V, int v, int w) {
for (int i = V; i >= v; i --) {
umin(dp[i], dp[i - v] + w);
}
}
void zeroPack_max(int V, int v, int w) {
for (int i = V; i >= v; i --) {
umax(dp[i], dp[i - v] + w);
}
}
void MultiPack(int V, int v, int w, int remain, bool id) {
if (!remain) return;
int num = ;
while (remain) {
if (!id) zeroPack_min(V, v * num, w * num);
else zeroPack_max(V, v * num, w * num);
remain -= num;
num <<= ;
umin(num, remain);
}
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif // ONLINE_JUDGE
int T, n, m, p, v, w, c;
cin >> T;
while (T --) {
cin >> n >> m >> p;
fillchar(dp, 0x3f);
dp[] = ;
for (int i = ; i < n; i ++) {
scanf("%d%d%d", &v, &w, &c);
MultiPack(p + , v, w, c, );
}
int place = 0x3f3f3f3f;
for (int i = p; i <= p + ; i ++) umin(place, dp[i]);
fillchar(dp, );
for (int i = ; i < m; i ++) {
scanf("%d%d%d", &w, &v, &c);
MultiPack(, v, w, c, );
}
int ans = -;
for (int i = ; i <= ; i ++) {
if (dp[i] >= place) {
ans = i;
break;
}
}
if (~ans) cout << ans << endl;
else puts("TAT");
}
}

最新文章

  1. Android编译过程中的碎碎念
  2. 用JS获取地址栏参数的方法
  3. svn: Can&#39;t convert string from &#39;UTF-8&#39; to native encoding 的解决办法(转)
  4. 360chrome,google chrome浏览器使用jquery.ajax加载本地html文件
  5. Trick
  6. leetcode52. N-Queens II
  7. jQuery formValidator表单验证插件
  8. 第一篇、Swift_搭建UITabBarController + 4UINavigationController主框架
  9. [转] Hive 内置函数
  10. localStorage点击次数存储
  11. Day1_PHP快速入门
  12. 面试中有关C++的若干问题
  13. (中等) POJ 2991 Crane , 几何+线段树。
  14. Entity Framework入门教程: Entity Framework支持的查询方式
  15. 剑指OFFER——合并两个有序的链表
  16. 修改Jupyter notebook的启动目录
  17. Shell编程实践之批量安装JDK
  18. PHP7 中 ?? 与? :的区别
  19. iOS开发基础-图片切换(2)之懒加载
  20. 移动端目标识别(2)——使用TENSORFLOW LITE将TENSORFLOW模型部署到移动端(SSD)之TF Lite Developer Guide

热门文章

  1. Git敏捷开发--reset和clean
  2. Python - 和我聊Python节目最新一期介绍 - 257期:使用超级电脑,Python,射电天文学知识来探索银河系
  3. mongo基础
  4. 彻底弄懂GMT、UTC、时区和夏令时
  5. SpringMVC Spring Mybatis整合篇
  6. react: typescript jest &amp;&amp; enzyme
  7. 一、搭建SpringBoot2.0.0M4基础Web项目
  8. Python爬虫入门(基础实战)—— 模拟登录知乎
  9. MySQL基础知识和常用命令总结
  10. 头文件&lt;cmath&gt;中常用函数