P2732 商店购物 Shopping Offers

    • 23通过
    • 41提交
  • 题目提供者该用户不存在
  • 标签USACO
  • 难度提高+/省选-

提交  讨论  题解

最新讨论

  • 暂时没有讨论

题目背景

在商店中,每一种商品都有一个价格(用整数表示)。例如,一朵花的价格是 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

分析:这道题和斗地主很像,目的就是要把所有的物品买完,也就相当于把牌出完,给你几种优惠方式相当于牌的组合,让我不禁联想到了noip2015斗地主,我们可以搜索每一种优惠方式能不能行,如果可以就继续,不行就搜索下一种优惠方式,如果都不行,那么就只能一个一个的买了,为了避免重复,用了一个hash,但是这样还是超时了.听raffica神犇说如果倒着输入会有惊喜,然后发现,还是T了5个点,只能想其他的办法.

发现搜索是从已知状态扩展到未知状态,如果是用已知状态来更新未知状态呢?这就是dp了,枚举优惠方式,如果可行,则根据优惠方式所需的物品来推得当前的状态,f[a][b][c][d][e] = f[a - i][b - j][c - k][d - l][e - m] + p,i,j,k,l,m都是所需的物品,p是钱数,这其实就是完全背包.

49分代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;int s,b,vis1[10000],need[100],neednum[10000],needmoney[10000],ans = 10000000,vis[6][6][6][6][6],hashh[3000000],tot;struct node
{int num[10000];int money;
}a[110];void dfs(int m,int n)
{int flag = 0;for (int i = 1; i <= n; i++){//printf("%d\n", neednum[need[i]]);if (neednum[need[i]] != 0){flag = 1;break;}}if (flag == 0)if (ans > m){ans = m;return;}if (hashh[vis[neednum[need[1]]][neednum[need[2]]][neednum[need[3]]][neednum[need[4]]][neednum[need[5]]]] != 0 && hashh[vis[neednum[need[1]]][neednum[need[2]]][neednum[need[3]]][neednum[need[4]]][neednum[need[5]]]] == m)return;vis[neednum[need[1]]][neednum[need[2]]][neednum[need[3]]][neednum[need[4]]][neednum[need[5]]] = ++tot;hashh[vis[neednum[need[1]]][neednum[need[2]]][neednum[need[3]]][neednum[need[4]]][neednum[need[5]]]] = m;for (int i = 1; i <= s; i++){int flag1 = 0;for (int j = 1; j <= n; j++)if (neednum[need[j]] < a[i].num[need[j]]){flag1 = 1;break;}if (flag1 == 0){//printf("%d\n", i);for (int j = 1; j <= n; j++)neednum[need[j]] -= a[i].num[need[j]];dfs(m + a[i].money, n);for (int j = 1; j <= n; j++)neednum[need[j]] += a[i].num[need[j]];}}for (int i = 1; i <= n; i++)if (neednum[need[i]] >= 1){neednum[need[i]]--;dfs(m + needmoney[need[i]], n);neednum[need[i]]++;}return;
}int main()
{scanf("%d", &s);for (int i = s; i >= 1; i--){int n,t = 0,p;scanf("%d", &n);for (int j = 1; j <= n; j++){int k, c;scanf("%d%d", &c, &k);a[i].num[c] = k;}scanf("%d", &p);a[i].money = p;}scanf("%d", &b);int t = 0;for (int i = 1; i <= b; i++){int c, k, p;scanf("%d%d%d", &c, &k, &p);if (!vis1[c]){vis1[c] = 1;need[++t] = c;}neednum[c] = k;needmoney[c] = p;}/*for (int i = 1; i <= s; i++){for (int j = 1; j <= t; j++)printf("%d需要%d\n", need[j], a[i].num[need[j]]);printf("钱%d\n", a[i].money);}for (int i = 1; i <= t; i++)printf("%d %d %d\n", need[i], neednum[need[i]], needmoney[need[i]]);*/dfs(0,t);printf("%d\n", ans);//while (1);return 0;
}

AC代码(显然不是我的):

#include<cstdio>
#include<iostream>
#include<algorithm>
int n;
int i, j, k, l, m, z;
struct haha
{int n;int k[6];int p;
}a[200];
int nn;
int d[1000];
int t;
int ai, bi, ci;
int f[6][6][6][6][6];
int x[6];
using namespace std;
int main()
{scanf("%d", &n);for (i = 1;i <= n;i++){scanf("%d", &a[i].n);for (j = 1;j <= a[i].n;j++){scanf("%d%d", &ai, &bi);if (d[ai] == 0){t++;d[ai] = t;}a[i].k[d[ai]] = bi;}scanf("%d", &a[i].p); }scanf("%d", &nn);for (i = 1;i <= nn;i++){scanf("%d%d%d", &ai, &bi, &ci);if (d[ai] == 0){t++;d[ai] = t;}x[d[ai]] = bi;n++;a[n].n = 1;a[n].k[d[ai]] = 1;a[n].p = ci;}for (i = 0;i <= 5;i++)for (j = 0;j <= 5;j++)for (k = 0;k <= 5;k++)for (l = 0;l <= 5;l++)for (m = 0;m <= 5;m++)f[i][j][k][l][m] = 10000000;f[0][0][0][0][0] = 0; for (z = 1;z <= n;z++)for (i = a[z].k[1];i <= x[1];i++)for (j = a[z].k[2];j <= x[2];j++)for (k = a[z].k[3];k <= x[3];k++)for (l = a[z].k[4];l <= x[4];l++)for (m = a[z].k[5];m <= x[5];m++)f[i][j][k][l][m] = min(f[i][j][k][l][m],f[i - a[z].k[1]][j - a[z].k[2]][k - a[z].k[3]][l - a[z].k[4]][m - a[z].k[5]]+ a[z].p);printf("%d\n", f[x[1]][x[2]][x[3]][x[4]][x[5]]);return 0;
}

转载于:https://www.cnblogs.com/zbtrs/p/5962765.html

洛谷P2732 商店购物 Shopping Offers相关推荐

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

    商店购物 (shopping.c/cpp/pas) 1.商店购物 (shopping.c/cpp/pas) 在滨海市开着 n 家商店,编号依次为 1 到 n,其中编号为 1 到 m 的商店有日消费量上 ...

  2. 洛谷(P1658 购物 C++)

    题目描述: 你就要去购物了,现在你手上有 N种不同面值的硬币,每种硬币有无限多个.为了方便购物,你希望带尽量少的硬币,但要能组合出 1到 X 之间的任意值. 输入格式: 第一行两个数 X, N,以下  ...

  3. 洛谷T172100 商店-贪心

    解题思路: 贪心 代码如下: #include <iostream> #include <algorithm> using namespace std; const int N ...

  4. 洛谷 1658 购物

    洛谷 1658 购物 题目描述 你就要去购物了,现在你手上有N种不同面值的硬币,每种硬币有无限多个.为了方便购物,你希望带尽量少的硬币,但要能组合出1到X之间的任意值. 输入输出格式 输入格式: 第一 ...

  5. 【暑期每日一题】洛谷 P7621 [AHOI2021初中组] 超市购物

    题目链接:P7621 [AHOI2021初中组] 超市购物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 AHOI2021 初中组 T1 你可以选择跳过背景部分. 春的一 ...

  6. 洛谷——【入门2】分支结构

    文章目录 题单简介 [深基1-2]小学数学 N 合一 题目描述 问题 1 问题 2 问题 3 问题 4 问题 5 问题 6 问题 7 问题 8 问题 9 问题 10 问题 11 问题 12 问题 13 ...

  7. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  8. 广度优先搜索——好奇怪的游戏(洛谷 P1747)

    题目选自洛谷P1747 简单的广搜模板题,4+8 = 12个方向进行bfs,目的地是(1,1) 每次查看队首是否到达,若到达(1,1) 则返回队首步长即可~ 需要注意的是,马走日和像走田的位置计算 i ...

  9. 洛谷——P2433 【深基1-2】小学数学 N 合一

    P2433 [深基1-2]小学数学 N 合一 题目描述 问题 1 请输出 I love Luogu! 问题 2 这里有 10 个苹果,小A 拿走了 2 个,Uim 拿走了 4 个,八尾勇拿走剩下的所有 ...

  10. 洛谷 题单2分支结构(freshman锻炼牛犇勿喷)

    第一题数的性质 题目描述 一些数字可能拥有以下的性质: 性质 1:是偶数: 性质 2:大于 4 且不大于 12. 小A 喜欢这两个性质同时成立的数字:Uim 喜欢这至少符合其中一种性质的数字:八尾勇喜 ...

最新文章

  1. 从一个提问引发到你是怎么看待编程语言是一种工具这句话的?【笔记自用】
  2. 若依微服务版怎样在common-core模块下引用第三方lib的jar包(MobileIMSDK4J_tcp的jar包)
  3. AOS编排语言系列教程(三):创建子网Subnet
  4. pppoe服务器虚拟机,Hyper-V 批量建立虚拟机自动改IP并配置PPPOE拨号
  5. Python生成requirements.txt方法
  6. about command : wget
  7. HTML中浮动的特性,浅谈CSS浮动的特性
  8. mysql 重建表空间_表空间瘦身之重建表
  9. httpclient4.3+jsoup模拟登陆河北移动
  10. 六十八个经典管理小故事
  11. android 控制手机,如何用Android手机控制另一部手机[详细说明]
  12. java粘包_Java网络通信基础系列-Netty粘包与拆包
  13. 北京易思汇商务服务有限公司 留学缴费
  14. js实现点击切换checkbox背景图片
  15. odoo:开源 ERP/CRM 入门与实践 -- 上海嘉冰信息技术公司提供咨询服务
  16. 【排序】八大排序算法简介及它们各自的特点总结
  17. 一、Composer下载安装
  18. 计算机表格常用根式,excel怎么建立常用根式_在excel中怎样开根号�9�3
  19. python自学视频与excel_小白也能学习的 python pandas excel 处理[视频]
  20. Idea stash 谨慎点玩

热门文章

  1. 再谈UDP协议—浅入理解深度记忆
  2. nodejs安装anywhere快速启动一个web服务
  3. spring的前后台数据传输。
  4. redis 分布式锁_基于 Redis 实现的分布式锁
  5. 安卓为什么没有菊花进度条_全新软件首发,居然明目张胆的开车!支持ios+安卓,请务必低调使用!...
  6. 6.4Spring环境配置等级和优先级
  7. 5.5使用Cucumber来测试
  8. 【渝粤教育】广东开放大学 微信平台开发与应用 形成性考核 (54)
  9. 线性模型第4讲:弹性网络
  10. 【sklearn第五讲】特征提取(上)