USACO Training 3.3 商店购物 By cellur925

题目传送门

这道题有着浓浓的背包气氛。所以我们可以这样想:可以把每个优惠方案都当做一个物品,每个单买所需要花的钱也当做一个物品。(也就是代码中的p结构体数组)而且基于此题的环境,这题是一个完全背包。
另外因为本题的算法比较亲民,至多买5种物品,每种物品最多买5个,所以我们可以(开创性地)使用五维背包。

状态:设f[i][j][k][a][b]表示买i件物品1,j件物品2,k件物品3,a件物品4,b件物品5所需要的最小价钱。(也就是说,我们熟悉的背包模板中f[i]中i的含义从体积在此题背景下变成了购买个数)

转移:f[i][j][k][a][b]=min(f[i][j][k][a][b],f[i-p[pos].cnt[1]][j-p[pos].cnt[2]][k-p[pos].cnt[3]][a-p[pos].cnt[4]][b-p[pos].cnt[5]]+p[pos].val);

边界:f[0][0]=0,其余为正无穷。(这种条件有时必要有时不必要,需要 具体分析)

将繁琐的数据输入处理后,我们就开始进行背包了。

但有一点需要注意,也是本题的重难点(之一)。也就是各个物品的编号给他转成1~5.但是其实数据已经约定了,购买方案中涉及到的产品应该也都是要买的。

所以每组数据涉及到的物品也就最多5个。

* 本题其实还可以用最短路做,这也是我之前比较倾向的算法。但是如何把各种购买方案映射好,却是一个难题。所以放弃了==

(@Sarah :每个节点的标号可以映射成一个篮子的物品个数情况,每一个优惠方式(包括以物品原价购买)表示一条边,权值就是花费,所以就是求一个从空篮子到目标篮子的最短路径。)

 Code

 1 /*
 2 ID:cellur_2
 3 TASK:shopping
 4 LANG:C++
 5 */
 6 #include<cstdio>
 7 #include<algorithm>
 8 #include<map>
 9
10 using namespace std;
11 const int inf=0x3f3f3f3f;
12
13 int s,n,b,t;
14 int real[10];
15 int f[10][10][10][10][10];
16 struct goods{
17     int val;
18     int n;
19     int cnt[10];
20 }p[200];
21 map<int,int>m;
22
23 void init()
24 {
25     for(int i=0;i<=5;i++)
26         for(int j=0;j<=5;j++)
27             for(int k=0;k<=5;k++)
28                 for(int a=0;a<=5;a++)
29                     for(int b=0;b<=5;b++)
30                         f[i][j][k][a][b]=inf;
31     f[0][0][0][0][0]=0;
32 }
33
34 int main()
35 {
36     freopen("shopping.in","r",stdin);
37     freopen("shopping.out","w",stdout);
38     scanf("%d",&s);
39     for(int i=1;i<=s;i++)
40     {
41         scanf("%d",&n);
42         p[i].n=n;
43         for(int j=1;j<=n;j++)
44         {
45             int c=0,k=0;
46             scanf("%d%d",&c,&k);
47             if(m[c]==0) t++,m[c]=t;
48             p[i].cnt[m[c]]=k;
49         }
50         scanf("%d",&p[i].val);
51     }
52     scanf("%d",&b);
53     for(int i=1;i<=b;i++)
54     {
55         s++;
56         int a=0,d=0,e=0;
57         scanf("%d%d%d",&a,&d,&e);
58         if(m[a]==0) t++,m[a]=t;
59         p[s].n=1,p[s].val=e,p[s].cnt[m[a]]=1;
60         real[m[a]]=d;
61     }
62     init();
63     for(int pos=1;pos<=s;pos++)
64         for(int i=p[pos].cnt[1];i<=real[1];i++)
65             for(int j=p[pos].cnt[2];j<=real[2];j++)
66                 for(int k=p[pos].cnt[3];k<=real[3];k++)
67                     for(int a=p[pos].cnt[4];a<=real[4];a++)
68                         for(int b=p[pos].cnt[5];b<=real[5];b++)
69                             f[i][j][k][a][b]=min(f[i][j][k][a][b],f[i-p[pos].cnt[1]][j-p[pos].cnt[2]][k-p[pos].cnt[3]][a-p[pos].cnt[4]][b-p[pos].cnt[5]]+p[pos].val);
70     printf("%d\n",f[real[1]][real[2]][real[3]][real[4]][real[5]]);
71     return 0;
72 }

原文地址:https://www.cnblogs.com/nopartyfoucaodong/p/9635395.html

时间: 2024-11-09 02:57:46

USACO Training 3.3 商店购物 By cellur925的相关文章

洛谷P2732 商店购物 Shopping Offers

P2732 商店购物 Shopping Offers 23通过 41提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 在商店中,每一种商品都有一个价格(用整数表示).例如,一朵花的价格是 2 zorkmids (z),而一个花瓶的价格是 5z .为了吸引更多的顾客,商店举行了促销活动. 题目描述 促销活动把一个或多个商品组合起来降价销售,例如: 三朵花的价格是 5z 而不是 6z, 两个花瓶和一朵花的价格是 10z 而不是

USACO Training完结感想

USACO Training在历经几年时间后终于被我刷完了.其实我很早就已经刷完了,只不过一直拖到今天才发完blog.真是怠惰呢~~~~~ USACO绝对是我成长的记录者,它看着我,从当初初出茅庐的小子一步步走到今天.虽然不能说是什么大犇,但是也是有一定实力的选手. USACO一共有6章.从简易到困难,从整体上来说这个题库不算难.是一个适合新手锻炼的地方.当然里面也有很多比较经典的题目. 它一直陪伴着我的成长,正如一只COW一样哺育了我. 如果完成前3章已经可以在NOIP中得到不错的成绩了,但是

USACO Training Section 3.1 Contact

P2724 联系 Contact 题目背景 奶牛们开始对用射电望远镜扫描牧场外的宇宙感兴趣.最近,他们注意到了一种非常奇怪的脉冲调制微波从星系的中央发射出来.他们希望知道电波是否是被某些地外生命发射出来的,还是仅仅是普通的的星星发出的 题目描述 帮助奶牛们用一个能够分析他们在文件中记下的记录的工具来找到真相.他们在寻找长度在A到B之间(包含A和B本身)在每天的数据文件中重复得最多的比特序列 (1 <= A <= B <= 12).他们在找那些重复得最多的比特序列.一个输入限制告诉你应输出

shell脚本(2)商店购物

商店购物 1.2.3. 原文地址:http://blog.51cto.com/13813317/2151925

商店购物 (shopping.c/cpp/pas)

1.商店购物 (shopping.c/cpp/pas) 在滨海市开着 n 家商店,编号依次为 1 到 n,其中编号为 1 到 m 的商店有日消费量上 限,第 i 家商店的日消费量上限为 wi. 海霸王每次购物的过程是这样的:依次经过每家商店,然后购买非负整数价格的商品,并 在结账的时候在账本上写上在这家商店消费了多少钱.当然,他在这家商店也可以什么都不 买,然后在账本上写上一个 “0”. 这一天,海霸王日常完成了一次购物,但是他不慎遗失了他的账本.他只记得自己这一 天一共消费了多少钱,请写一个程

商店购物

某商店中每种商品都有一个价格.特殊优惠商品是把一种或几种商品分成一组.并降价销售.编一个程序,计算某个顾客所购商品应付的费用. 要充分利用优惠价以使顾客付款最小.你不能变更顾客所购商品的种类及数量. 输入数据 用两个文件表示输入数据.第一个文件INPUT.TXT描述顾客所购物品(放在购物筐中);第二个文件描述商店提供的优惠商品及价格(文件名为OFF ER.TXT). 两个文件中都只用整数. 第一个文件INPUT.TXT的格式为:第一行是一个数字B(0≤B≤5),表示所购商品种类数.下面共B行,每

LuoGu 1200 你的飞碟在这儿 &amp;&amp; USACO Training Section 1.1_1

描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用 一种聪明的方案让这些小组提前知道谁会被彗星带走.他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给 这些彗星取的名字呢?).关于如何搭配的细节会在下面告诉你:你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的UFO带 走. 小组名和彗星名都以下列方式转换成一个数字:最终的数字

USACO Training Section3.1 Score Inflation

我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数.你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大.输入包括竞赛的时间,M(1 <= M <= 10,000)和N,"种类"的数目1 <= N <= 10,000.后面的每一行将包括两个整数来描述一个"种类": 第一个

bzoj2260: 商店购物 &amp;&amp; 4349: 最小树形图

Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价:如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元/听的优惠价……诸如此类的优惠方案就是说:如果您在本店购买了商品A的话,您就可以以P元/件的优惠价格购买商品B(购买的数量不限).有趣的是,你需要购买同样一些商品,由于不同的购买顺序,Gr