题目地址:http://poj.org/problem?id=1170

Description




In a shop each kind of product has a price. For example, the price of a flower is 2 ICU (Informatics Currency Units) and the price of a vase is 5 ICU. In order to attract more customers, the shop introduces some special offers.

A special offer consists of one or more product items for a reduced price. Examples: three flowers for 5 ICU instead of 6, or two vases together with one flower for 10 ICU instead of 12.

Write a program that calculates the price a customer has to pay for certain items, making optimal use of the special offers. That is, the price should be as low as possible. You are not allowed to add items, even if that would lower the price.

For the prices and offers given above, the (lowest) price for three flowers and two vases is 14 ICU: two vases and one flower for the reduced price of 10 ICU and two flowers for the regular price of 4 ICU.

Input

Your program is to read from standard input. The first line contains the number b of different kinds of products in the basket (0 <= b <= 5). Each of the next b lines contains three values c, k, and p. The value c is the (unique)
product code (1 <= c <= 999). The value k indicates how many items of this product are in the basket (1 <= k <= 5). The value p is the regular price per item (1 <= p <= 999). Notice that all together at most 5*5=25 items can be in the basket. The b+2nd line
contains the number s of special offers (0 <= s <= 99). Each of the next s lines describes one offer by giving its structure and its reduced price. The first number n on such a line is the number of different kinds of products that are part of the offer (1
<= n <= 5). The next n pairs of numbers (c,k) indicate that k items (1 <= k <= 5) with product code c (1 <= c <= 999) are involved in the offer. The last number p on the line stands for the reduced price (1 <= p <= 9999). The reduced price of an offer is less
than the sum of the regular prices.

Output

Your program is to write to standard output. Output one line with the lowest possible price to be paid.

Sample Input

2
7 3 2
8 2 5
2
1 7 3 5
2 7 1 8 2 10

Sample Output

14

谨以此来纪念蛋疼六重循环!!!

#include <stdio.h>
#include <string.h>
#include <limits.h> int code[6]; //商品代码
int num[6]; //商品数量
int price[6]; //商品价格
int special_num[100][6]; //促销项目各个商品数量
int special_cnt[100]; //促销项目的商品数量
int special_price[100]; //促销项目价格
int basket;
int special;
int dp[6][6][6][6][6]; int Decode (int c){
int i;
for (i=1; i<=5; ++i){
if (code[i] == c)
break;
}
return i;
} void Init(){
int i;
int j;
int c;
int k;
int index; scanf ("%d", &basket);
for (i=1; i<=basket; ++i){
scanf ("%d%d%d", &code[i], &num[i], &price[i]);
}
scanf ("%d", &special);
for (i=1; i<=special; ++i){
scanf ("%d", &special_cnt[i]);
for (j=1; j<=special_cnt[i]; ++j){
scanf ("%d%d", &c, &k);
index = Decode (c);
special_num[i][index] = k;
}
scanf ("%d", &special_price[i]);
}
} void Lowest_Price (){
int i1, i2, i3, i4, i5;
int i;
int tmp1, tmp2;
memset (dp, -1, sizeof(dp));
dp[0][0][0][0][0] = 0;
for (i1=0; i1<=num[1]; ++i1){
for (i2=0; i2<=num[2]; ++i2){
for (i3=0; i3<=num[3]; ++i3){
for (i4=0; i4<=num[4]; ++i4){
for (i5=0; i5<=num[5]; ++i5){
tmp1 = INT_MAX;
tmp2 = INT_MAX;
for (i=1; i<=special; ++i){
if (i1 >= special_num[i][1] &&
i2 >= special_num[i][2] &&
i3 >= special_num[i][3] &&
i4 >= special_num[i][4] &&
i5 >= special_num[i][5]){
tmp2 = dp[i1-special_num[i][1]]
[i2-special_num[i][2]]
[i3-special_num[i][3]]
[i4-special_num[i][4]]
[i5-special_num[i][5]] + special_price[i];
if (tmp1 > tmp2)
tmp1 = tmp2;
}
}
if (tmp1 != INT_MAX){
dp[i1][i2][i3][i4][i5] = tmp1;
}
else{
dp[i1][i2][i3][i4][i5] = i1 * price[1] + i2 * price[2]
+ i3 * price[3] + i4 * price[4] + i5 * price[5];
}
}
}
}
}
}
printf ("%d\n", dp[num[1]][num[2]][num[3]][num[4]][num[5]]);
} int main(void){
Init ();
Lowest_Price (); return 0;
}

POJ 1170 Shopping Offers -- 动态规划(虐心的六重循环啊!!!)的更多相关文章

  1. 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)

    作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...

  2. poj 1170 Shopping Offers

    Shopping Offers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4696   Accepted: 1967 D ...

  3. POJ 1170 Shopping Offers非状态压缩做法

    Shopping Offers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5659 Accepted: 2361 Descr ...

  4. poj - 1170 - Shopping Offers(减少国家dp)

    意甲冠军:b(0 <= b <= 5)商品的种类,每个人都有一个标签c(1 <= c <= 999),有需要购买若干k(1 <= k <=5),有一个单价p(1 & ...

  5. POJ 1170 Shopping Offers(完全背包+哈希)

    http://poj.org/problem?id=1170 题意:有n种花的数量和价格,以及m种套餐买法(套餐会便宜些),问最少要花多少钱. 思路:题目是完全背包,但这道题目不好处理的是套餐的状态, ...

  6. POJ - 1170 Shopping Offers (五维DP)

    题目大意:有一个人要买b件商品,给出每件商品的编号,价格和数量,恰逢商店打折.有s种打折方式.问怎么才干使买的价格达到最低 解题思路:最多仅仅有五种商品.且每件商品最多仅仅有5个,所以能够用5维dp来 ...

  7. HDU 1170 Shopping Offers 离散+状态压缩+完全背包

    题目链接: http://poj.org/problem?id=1170 Shopping Offers Time Limit: 1000MSMemory Limit: 10000K 问题描述 In ...

  8. Week 9 - 638.Shopping Offers - Medium

    638.Shopping Offers - Medium In LeetCode Store, there are some kinds of items to sell. Each item has ...

  9. 洛谷P2732 商店购物 Shopping Offers

    P2732 商店购物 Shopping Offers 23通过 41提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 在商店中, ...

随机推荐

  1. JS 函数调用

    Js函数调用的方式有如下几种情况: (1)具名函数直接调用 function foo() { } foo(); (2)匿名函数通过引用来调用 fooRef = function() { } fooRe ...

  2. HDU 3452 Bonsai(网络流之最小割)

    题目地址:HDU 3452 最小割水题. 源点为根节点.再另设一汇点,汇点与叶子连边. 对叶子结点的推断是看度数是否为1. 代码例如以下: #include <iostream> #inc ...

  3. BZOJ 1143: [CTSC2008]祭祀river 最长反链

    1143: [CTSC2008]祭祀river Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  4. JS字符处理

    JS取整 1.toFixed(num)(ps:num为保留小数点后几位) 自定义保留小数点后几位,进行四舍五入.严格来说,这个函数不属于取整,但是当num=0时,也就是取整了,所以一起放到这里,方便查 ...

  5. cocos2d-x3.1.1 step by step 学习笔记1----- 软件的安装与HelloWord

    1:软件安装 系统:WIn7 软件:VS2012.cocosd-x3.1.1.python2.6.7.doxygen <1>首先安装VS2012,安装也是傻瓜式安装, <2>然 ...

  6. JPA OpenJPA 简单例子

    JPA 全称,Java Persistence API,Java持久化API JPA是一套持久化标准,相当于JDBC标准,针对于此标准的实现目前有OpenJAP,TOPLINK,Hibernate等. ...

  7. Linux系统常见的压缩命令

    *.Z compress 程序压缩的文件: //在当前的Linux主流版本中都已经默认没有支持该压缩命令了,因为gzip命令已经取代了compress命令了 *.gz gzip 程序压缩的文件: *. ...

  8. jvm内存模型及分配参数

    jvm内存模型 程序计数器:是一块很小的内存空间.当线程数量超过cpu数量时,线程之间根据时间片轮询抢夺cpu资源.每一个线程都必须用一个独立的程序计数器,用于记录下一条要运行的指令. java虚拟机 ...

  9. 嵌入式中 MMU的功能

    学习嵌入式才发现要看的书太多,外面的世界很精彩啊,现在来说说MMU吧,MMU是Memory Management Unit的缩写,是用来管理虚拟内存系统的器件. MMU通常是CPU的一部分,本身有少量 ...

  10. nodejs中npm工具自身升级

    npm官方地址:https://www.npmjs.com/ npm在github上的地址:https://github.com/npm/npm 目前(截止2016-03-15)npm最新版本为3.8 ...