UVa 10898 Combo Deal DP
来源:互联网 发布:2017手机电视直播软件 编辑:程序博客网 时间:2024/06/03 13:02
D: Combo Deal
A fast food store offers a series of ``combo meal deals" in addition to individually priced items. For example, the menu at the store may look like this:Hamburger $3.49 Fries $0.99 Pop $1.09 Ice Cream $2.19 Value Meal (1 Hamburger, 1 Fries, 1 Pop) $4.79 Lovers-Only (2 Hamburgers, 2 Fries, 2 Pops, 1 Ice Cream) $9.99Buying a combo is cheaper than buying its items individually.
A parent of many kids (or a coach of many students) face this recurring problem: I need to get, say, 9 hamburgers, 6 fries, and 8 pops. How do I fit this into the menu, using the combo deals optimally, so as to pay as little as possible? Note that I am a conservativist, so I don't buy more food than I need.
Input
The input contains several test cases, each of them with a menu and several orders.- Menu: Individual items, then combos.
- (a)
- Individual items: number of items , then their prices (at most $10 each).
- (b)
- Combos: number of combos (at most 8), then for each combo, its composition as an -tuple of quantities and its price.
Example: the sample input below encodes the menu above.
- Orders: number of orders (at most 10), then for each order, an -tuple of the wanted quantities. Each element in the tuples is at most 9.
All prices are integers in cents.
Output
For each order of each case, output the minimum payment in cents on its own line.Sample Input
4 349 99 109 21921 1 1 0 4792 2 2 1 99929 6 8 09 6 8 5
Sample Output
41394700
#include <cstdio>#include <queue>#include <vector>#define PB push_backusing namespace std; struct Combo { Combo() { for (int i = 0; i < 6; i++) { num[i] = 0; } } int num[6], price;}; int best[1000000]; int main() { int N; while (scanf("%d", &N) == 1) { vector<Combo> combos; for (int i = 0; i < N; i++) { Combo combo; scanf("%d", &combo.price); combo.num[i] = 1; combos.PB(combo); } int M; scanf("%d", &M); while (M--) { Combo combo; for (int i = 0; i < N; i++) { scanf("%d", &combo.num[i]); } scanf("%d", &combo.price); combos.PB(combo); } int last = 0; for (int i = 0; i < N; i++) { last = last * 10 + 9; } for (int i = 1; i <= last; i++) { best[i] = 2e9; } best[0] = 0; for (int price = 0; price <= last; price++) { if (best[price] == 2e9) { continue; } int num[6] = {}; for (int temp = price, d = N - 1; temp; temp /= 10, d--) { num[d] = temp % 10; } for (int i = 0; i < combos.size(); i++) { int next[6] = {}, index = 0; bool push = true; for (int j = 0; j < N && push; j++) { next[j] = num[j] + combos[i].num[j]; index = index * 10 + next[j]; push = (next[j] <= 9); } if (!push) { continue; } best[index] = min(best[index], best[price] + combos[i].price); } } scanf("%d", &M); while (M--) { int index = 0; for (int i = 0; i < N; i++) { int num; scanf("%d", &num); index = index * 10 + num; } printf("%d\n", best[index]); } } return 0;}
0 0
- UVa 10898 Combo Deal DP
- combo
- deal sea
- deal,电机
- bam deal
- UVA DP 入门专题
- uva 1424 简单DP
- uva 10192 DP
- UVA dp题目汇总
- UVa 4256 - Salesmen dp
- UVa 10271 - Chopsticks dp
- UVA 1424 - Salesmen (dp)
- uva 672 Gangsters( dp )
- UVA 10271 Chopsticks(dp)
- uva 10271 Chopsticks(dp)
- UVA 11584 DP水题
- UVA 1424 DP水题
- UVA 10534 DP+LIS
- asp.net 写日志记录
- 深入 Java 调试体系,第 2 部分: JVMTI 和 Agent 实现
- NodeJs抓取新闻正文和正文中的图片
- C/C++入门到高手PDF收藏
- Spring的Component-scan
- UVa 10898 Combo Deal DP
- Hibernate 二级缓存 总结整理
- mysql字符集问题
- centos6.3 安装mongodb
- 外贸支付网关相关
- Linux内核中ioremap映射的透彻理解
- struct termios
- 深入 Java 调试体系,第 3 部分: JDWP 协议及实现
- TWMAN+ 流程分析