商店购物 Shopping Offers(完全背包问题+结构体使用)
2017-06-03 21:37
671 查看
P2732 商店购物 Shopping Offers
72通过135提交
题目提供者该用户不存在
标签 USACO
云端
难度 提高+/省选-
时空限制 1s / 128MB
最新讨论
暂时没有讨论题目背景
在商店中,每一种商品都有一个价格(用整数表示)。例如,一朵花的价格是 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 个商品。
输出格式:
只有一行,输出一个整数:购买这些物品的最低价格。
输入输出样例
输入样例#1:2 1 7 3 5 2 7 1 8 2 10 2 7 3 2 8 2 5
输出样例#1:
14
说明
题目翻译来自NOCOW。USACO Training Section 3.3
代码
#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<cstdlib> using namespace std; struct node{ int num;//这种方案的组成数量 int con[6];//每种数量 int w;//优惠价格 }a[100]; int dp[6][6][6][6][6],f=0; int p[1000]; int need[6]; int main(){ #ifndef ONLINE_JUDGE freopen("input.in","r",stdin); freopen("output.out","w",stdout); #endif int i,j,k,m,n,c,id; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i].num); for(j=1;j<=a[i].num;j++){ scanf("%d",&id); if(!p[id]) p[id]=++f; scanf("%d",&a[i].con[p[id]]); } scanf("%d",&a[i].w); } scanf("%d",&m); for(i=1;i<=m;i++){ scanf("%d%d%d",&id,&c,&k); if(!p[id]) p[id]=++f; need[p[id]]=c; a[n+i].num=1; a[n+i].con[p[id]]=1; a[n+i].w=k; } memset(dp,63,sizeof(dp)); /* for(int x=1;x<=n+m;x++){ printf("%d ",a[x].num); for(j=1;j<=5;j++) if(a[x].con[j]) printf("%d %d ",j,a[x].con[j]); printf("%d\n",a[x].w); } */ dp[0][0][0][0][0]=0; for(int x=1;x<=n+m;x++) for(int i=a[x].con[1];i<=need[1];i++) for(int j=a[x].con[2];j<=need[2];j++) for(int k=a[x].con[3];k<=need[3];k++) for(int u=a[x].con[4];u<=need[4];u++) for(int v=a[x].con[5];v<=need[5];v++){ dp[i][j][k][u][v]=min(dp[i][j][k][u][v],dp[i-a[x].con[1]][j-a[x].con[2]][k-a[x].con[3]][u-a[x].con[4]][v-a[x].con[5]]+a[x].w); } printf("%d",dp[need[1]][need[2]][need[3]][need[4]][need[5]]); return 0; }
相关文章推荐
- poj 1170 Shopping Offers 完全背包
- USACO-Section3.3 Shopping Offers【完全背包】
- 【USACO题库】3.3.2 Shopping Offers商店购物
- HDU 1170 Shopping Offers 离散+状态压缩+完全背包
- Shopping Offers USACO 3.3 (dp完全背包)
- POJ 1170 Shopping Offers(完全背包+哈希)
- 【USACO题库】3.3.2 Shopping Offers商店购物
- POJ 1170 Shopping Offers 6进制压缩状态+完全背包
- usaco Shopping Offers(多重完全背包)
- 背包问题教程-01背包,完全背包,多重背包,混合背包
- 0-1背包问题——使用动态规划方法解决
- 背包问题--POJ 1252 Euro Efficiency【完全背包】
- hdu 1284 钱币兑换问题 完全背包
- HDU 1284 钱币兑换问题 母函数 or 完全背包
- 使用动态编程方法,在降低时间复杂度的情况下获得背包问题的最优解
- USACO Score Inflation,完全背包问题
- (转)Linux静态/动态链接库的创建和使用 (为完全解决我的问题,但有借鉴作用)
- tyvj 1214 硬币问题 完全背包 恰好 最大/最少
- 使用嵌入式linux完全手册光盘的arm-linux-gcc 遇到问题 自己编译
- 总分——完全背包问题