题目地址: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. C++中str1::function和bind

    在C++的TR1中(TechnologyReport)中包括一个function模板类和bind模板函数,使用它们能够实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类的非静态成员函数 ...

  2. 【23】宁以non-member、non-friend替换member函数

    1.non-member方法与member方法没有本质区别,对于编译器来说,都是non-member方法,因为member方法绑定的对象,会被编译器转化为non-member方法的第一个形参.non- ...

  3. C++ 外部调用private方法

    1.思考,对于C++,能不能在外部调用私有方法? 2.在Java中,子类继承不能缩小父类成员的访问权限.因为在Java中,继承只是表示Is-A关系,因此,父类提供的接口,子类必须承诺仍然提供,不能缩小 ...

  4. android常见错误--INSTALL_FAILED_DEXOPT

    出现上面的问题,是由于手机的内存不足导致的,需要清理一下手机的内存,然后就可以了

  5. IE下载打印文件的时候,下载打印闪一下就没有了

    这是因为我们的浏览器没有将文件下载的自动提示设为启用.点击IE菜单栏中的“工具”—“Internet选项”-安全—可信站点—自定义级别 1,添加信任站点 打开IE浏览器,输入需要下载文件的地址 选择[ ...

  6. C#-datagridview设置列宽

    在使用datagridview的显示数据的过程中,常常会遇到需要设定datagridview的列宽,这就需要用到datagridview的属性: autosizemode

  7. node.js在windows下的学习笔记(9)---文件I/O模块

    开发中我们经常会有文件I/O的需求,node.js中提供一个名为fs的模块来支持I/O操作,fs模块的文件I/O是对标准POSIX函数的简单封装. 1.将"hello world" ...

  8. android学习日记16--GridView(网格视图)

    一.GridView 1.简述 GridView按照行列来显示图片或文本的一种视图,排列其实有点类似TableLayout布局, 不过和TableLayout还是差别很大的,倒比较像二维的ListVi ...

  9. OAuth 2 Developers Guide--reference

    Introduction This is the user guide for the support for OAuth 2.0. For OAuth 1.0, everything is diff ...

  10. 深入学习block

    首先,什么是block?block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用.那block是OC对象吗?答案是肯定的. 做一道很简单的关于block的测试题: i ...