USACO Section 3.3 商店购物 Shopping Offers
题目背景
在商店中,每一种商品都有一个价格(用整数表示)。例如,一朵花的价格是 2 zorkmids (z),而一个花瓶的价格是 5z 。为了吸引更多的顾客,商店举行了促销活动。
题目描述
促销活动把一个或多个商品组合起来降价销售,例如:
三朵花的价格是 5z 而不是 6z, 两个花瓶和一朵花的价格是 10z 而不是 12z。 编写一个程序,计算顾客购买一定商品的花费,尽量利用优惠使花费最少。尽管有时候添加其他商品可以获得更少的花费,但是你不能这么做。
对于上面的商品信息,购买三朵花和两个花瓶的最少花费的方案是:以优惠价购买两个花瓶和一朵花(10z),以原价购买两朵花(4z)。
输入输出格式
输入格式:
输入文件包括一些商店提供的优惠信息,接着是购物清单。(最多有5种商品)
第一行 优惠方案的种类数(0 <= s <= 99)。
第二行..第s+1 行 每一行都用几个整数来表示一种优惠方式。第一个整数 n (1 <= n <= 5),表示这种优惠方式由 n 种商品组成。后面 n 对整数 c 和 k 表示 k (1 <= k <= 5)个编号为 c (1 <= c <= 999)的商品共同构成这种优惠,最后的整数 p 表示这种优惠的优惠价(1 <= p <= 9999)。优惠价总是比原价低。
第 s+2 行 这一行有一个整数 b (0 <= b <= 5),表示需要购买 b 种不同的商品。
第 s+3 行..第 s+b+2 行 这 b 行中的每一行包括三个整数:c,k,p。 c 表示唯一的商品编号(1 <= c <= 999),k 表示需要购买的 c 商品的数量(1 <= k <= 5)。p 表示 c 商品的原价(1 <= p <= 999)。最多购买 5*5=25 个商品。
输出格式:
只有一行,输出一个整数:购买这些物品的最低价格。
商品的种类不超过五种,每种商品的个数不超过五个,那么可以设dp(a1,a2,a3,a4,a5)为五种商品分别买a1,a2,a3,a4,a5种时的最小花销(对于所有数据可以假设都是有五种商品,只是有的商品需求量是0而已),边界自然就是当五个数都是0的时候,花销为0,对于每一种情况的计算可以依次尝试枚举所有的优惠方案(如果数量够的话),再枚举单个购买的方案,这样推到下一层,由这个思路很容易得到递推公式,写记忆化搜索即可,还有一点是商品的编号不是1~5,而是1000内的5的整数,可以写一个ID函数进行映射(我的习惯),剩下的就是注意细节就OK啦
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
struct CH{
];
int pr;
};
][][][][],v[][][][][];
],counter=,yj[],need[];
int S,b;
vector<CH> ch;
int A(int a1,int a2,int a3,int a4,int a5){
if(v[a1][a2][a3][a4][a5]) return dp[a1][a2][a3][a4][a5];
v[a1][a2][a3][a4][a5]=;
int& ans=dp[a1][a2][a3][a4][a5];
;
ans=<<;
;i<S;i++){
]&&a2>=ch[i].s[]&&a3>=ch[i].s[]&&a4>=ch[i].s[]&&a5>=ch[i].s[])
ans=min(ans,A(a1-ch[i].s[],a2-ch[i].s[],a3-ch[i].s[],
a4-ch[i].s[],a5-ch[i].s[])+ch[i].pr);
}
,a2,a3,a4,a5)+yj[]);
,a3,a4,a5)+yj[]);
,a4,a5)+yj[]);
,a5)+yj[]);
)+yj[]);
return ans;
}
int ID(int x)
{
if(book[x]) return book[x];
return book[x]=++counter;
}
int main()
{
memset(book,,sizeof(book));
int n,c,k;
cin>>S;
;i<=S;i++){
cin>>n;
CH da;
;i<=;i++) da.s[i]=;
;j<=n;j++){
cin>>c>>k;da.s[ID(c)]=k;
}
cin>>da.pr;
ch.push_back(da);
}
cin>>b;
memset(yj,,sizeof(yj));
memset(need,,sizeof(need));
;i<=b;i++){
int c,k,p;
cin>>c>>k>>p;
yj[ID(c)]=p;
need[ID(c)]=k;
}
cout<<A(need[],need[],need[],need[],need[]);
;
}
USACO Section 3.3 商店购物 Shopping Offers的更多相关文章
- 洛谷P2732 商店购物 Shopping Offers
P2732 商店购物 Shopping Offers 23通过 41提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交 讨论 题解 最新讨论 暂时没有讨论 题目背景 在商店中, ...
- 商店购物 (shopping.c/cpp/pas)
1.商店购物 (shopping.c/cpp/pas) 在滨海市开着 n 家商店,编号依次为 1 到 n,其中编号为 1 到 m 的商店有日消费量上 限,第 i 家商店的日消费量上限为 wi. 海霸王 ...
- USACO Training 3.3 商店购物 By cellur925
题目传送门 这道题有着浓浓的背包气氛.所以我们可以这样想:可以把每个优惠方案都当做一个物品,每个单买所需要花的钱也当做一个物品.(也就是代码中的p结构体数组)而且基于此题的环境,这题是一个完全背包.另 ...
- USACO 3.3 Shopping Offers
Shopping OffersIOI'95 In a certain shop, each kind of product has an integer price. For example, the ...
- 【Bzoj2260】【Bzoj4349】商店购物 & 最小树形图
目录 List Bzoj 2260 商店购物 Description Input Output Sample Input Sample Output Bzoj 4349 最小树形图 Descripti ...
- Leetcode之深度优先搜索&回溯专题-638. 大礼包(Shopping Offers)
Leetcode之深度优先搜索&回溯专题-638. 大礼包(Shopping Offers) 深度优先搜索的解题详细介绍,点击 在LeetCode商店中, 有许多在售的物品. 然而,也有一些大 ...
- poj 1170 Shopping Offers
Shopping Offers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4696 Accepted: 1967 D ...
- LeetCode 638 Shopping Offers
题目链接: LeetCode 638 Shopping Offers 题解 dynamic programing 需要用到进制转换来表示状态,或者可以直接用一个vector来保存状态. 代码 1.未优 ...
- HDU 1170 Shopping Offers 离散+状态压缩+完全背包
题目链接: http://poj.org/problem?id=1170 Shopping Offers Time Limit: 1000MSMemory Limit: 10000K 问题描述 In ...
随机推荐
- chmod 权限777 是什么意思(Unix和Linux的各种操作系统下)
在Unix和Linux的各种操作系统下,每个文件(文件夹也被看作是文件)都按读.写.运行设定权限.例如我用ls -l命令列文件表时,得到如下输出:-rw-r--r-- 1 bu users 2254 ...
- free命令、buffer与cache的区别
freefree 命令相对于top 提供了更简洁的查看系统内存使用情况: # free total used free shared buffers cached Mem: 255988 231704 ...
- Session和Cookie深度剖析
Session和Cookie的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案.同时我们也看到,由于采用服务器端保持状态的方案在客户端 ...
- C#跟踪和调试程序-Debug类使用
摘要: 怎样在 Visual C# .NET 中跟踪和调试?当程序运行时,您可以使用 Debug 类的方法来生成消息,以帮助您监视程序执行顺序.检测故障或提供性能度量信息.默认情况下,Debug 类产 ...
- 黄聪:VS2010每次F5启动都重新编译但是没办法进入断点
这个问题主要是没有把Debug和Realse的生成配置勾上:
- Redis数据库?-Redis的Virtual Memory介绍(转)
众所周知,Redis是一个内存数据库,和Memcached类似,所有数据存在内存中,当然,Redis有rdb和appendonlyfile两个落地文件,可以对断电停机等故障下的数据恢复做一些保证.但是 ...
- Web上传文件
客户端 相对于FTP文件上传,Web文件上传速度慢一些,但使用方便,不需要客户端,而且权限比FTP容易控制. Web文件上传采用POST方式,上传文件需要设置FORM的entype属性为 ...
- [JS]Javascript的this用法
转自:阮一峰 this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 随着 ...
- HDU 2196 Computer 树形DP 经典题
给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...
- google protobuf 简单实例
1.定义proto文件: User.proto package netty; option java_package="myprotobuf"; option java_outer ...