最小费用购物问题


西安交大 软件53 蔡少斐

题号:3_14

题目叙述:

某商店中每种商品都有一个价格。例如,一朵花的价格是2 ICU(ICU 是信息学竞赛的货币的单位);一个花瓶的价格是5 ICU。为了吸引更多的顾客,商店提供了特殊优惠价。

    特殊优惠商品是把一种或几种商品分成一组。并降价销售。例如:3朵花的价格不是6而是5 ICU ;2个花瓶加1朵花是10 ICU不是12 ICU。

    编一个程序,计算某个顾客所购商品应付的费用。要充分利用优惠价以使顾客付款最小。请注意,你不能变更顾客所购商品的种类及数量,即使增加某些商品会使付款总数减小也不允许你作出任何变更。假定各种商品价格用优惠价如上所述,并且某顾客购买物品为:3朵花和2个花瓶。那么顾客应付款为14ICU因为:

        1朵花加2个花瓶: 优惠价:10  ICU

        2朵花           正常价: 4 ICU

输入数据

    用两个文件表示输入数据。第一个文件INPUT.TXT描述顾客所购物品(放在购物筐中);第二个文件描述商店提供的优惠商品及价格(文件名为OFFER.TXT)。 两个文件中都只用整数。

    第一个文件INPUT.TXT的格式为:第一行是一个数字B(0≤B≤5),表示所购商品种类数。下面共B行,每行中含3个数C,K,P。C 代表商品的编码(每种商品有一个唯一的编码),1≤C≤999。K代表该种商品购买总数,1≤K≤5。P 是该种商品的正常单价(每件商品的价格),1≤P≤999。请注意,购物筐中最多可放5*5=25件商品。

第二个文件OFFER.TXT的格式为:第一行是一个数字S(0≤S≤99),表示共有S种优惠。下面共S行,每一行描述一种优惠商品的组合中商品的种类。下面接着是几个数字对(C,K),其中C代表商品编码,1≤C≤9 99。K代表该种商品在此组合中的数量,1≤K≤5。本行最后一个数字P(1≤P≤9999)代表此商品组合的优惠价。当然,优惠价要低于该组合中商品正常价之总和。

输出数据

在输出文件OUTPUT.TXT中写一个数字(占一行), 该数字表示顾客所购商品(输入文件指明所购商品)应付的最低货款。

题目解答:

本题应该采用动态规划的方法进行设计,定义本题的最优子结构以及状态为一个五元组:dp[x1][x2][x3][x4][x5],其中x1代表要买的第一种物品的个数,x2代表要买的第二种物品的个数、以此类推。由于题目保证了B<=5,因此5元组绝对够用。

我们用一个std::vector来存储每套组合方案的捆绑的种类以及该种类需要购买的数量。

下面我们假定,不需要的物品一个都不能买,需要的物品也不能够多买。

要列出该5元组的状态转移方程,其中优惠集合记为S。

.

在代码实现的时候采用了备忘录技术。

代码表示:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> P;
const int MAX       = 6;
const int INF  = 1e9;
int          map[1000];
int          n, m;
int          ids[MAX];
int          price[MAX];
int          nums[MAX];
vector<P>     pairs[100];
int          pP[100];
int          pcnt = 0;
int          dp[MAX][MAX][MAX][MAX][MAX];
int          times = 0;
int dfs( int* x )
{times++;int r = dp[x[0]][x[1]][x[2]][x[3]][x[4]];if ( r > 0 ){return(r);}if ( x[0] == 0 && x[1] == 0 && x[2] == 0 && x[3] == 0 && x[4] == 0 ){return(0);}int minf = INF;for ( int i = 0; i < pcnt; i++ ){vector<P> & vec  = pairs[i];int          f      = 1;int          *y    = new int[5];for ( int t = 0; t < 5; t++ )y[t] = 0;for ( auto p : vec ){int   id    = map[p.first];int   num = p.second;if ( x[id] < num ){f = 0; break;}y[id] = -num;}if ( !f )continue;for ( int k = 0; k < 5; k++ )y[k] += x[k];minf = min( minf, pP[i] + dfs( y ) );}int s = 0;for ( int i = 0; i < 5; i++ ){s += x[i] * price[i];}minf = min( minf, s );return(dp[x[0]][x[1]][x[2]][x[3]][x[4]] = minf);
}int main()
{cin >> n;for ( int i = 0; i < n; i++ ){int C, K, PP;cin >> C >> K >> PP;ids[i]              = C;nums[i]          = K;price[i]    = PP;if ( !map[C] ){map[C] = i;}}cin >> m;for ( int i = 0; i < m; i++ ){int          k; cin >> k;vector<P>     v;int          f = 1;for ( int j = 0; j < k; j++ ){int a, b; cin >> a >> b;v.push_back( make_pair( a, b ) );}int PP;cin >> PP;if ( f ){pairs[pcnt]     = v;pP[pcnt++]    = PP;}}cout << "答案:" << dfs( nums ) << endl;cout << "运行次数:" << times << endl;return(0);
}

运行结果:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源服务容错处理库Polly使用文档

在进入SOA之后&#xff0c;我们的代码从本地方法调用变成了跨机器的通信。任何一个新技术的引入都会为我们解决特定的问题&#xff0c;都会带来一些新的问题。比如网络故障、依赖服务崩溃、超时、服务器内存与CPU等其它问题。正是因为这些问题无法避免&#xff0c;所以我们在进…

P2638-安全系统【数论,组合数学】

正题 题目链接:https://www.luogu.org/problem/P2638 题目大意 aaa个不同的000&#xff0c;bbb个不同的111。nnn个位置每个可以放0,10,10,1可以都放也可以不放也可以只放一个。然后求方案数。 解题思路 答案就是(∑i0aCni∗Cai)∗(∑i0bCni∗Cbi)(\sum_{i0}^a C_{n}^{i}*C_{a…

宝石排列问题

西安交大 软件53 蔡少斐 题号&#xff1a;5_10 题目叙述&#xff1a; 现有n种不同形状的宝石&#xff0c;每种n颗&#xff0c;共n*n颗。同一形状的n颗宝石分别具有n种不同的颜色c1,c2,…,cn中的一种颜色。欲将这n*n颗宝石排列成n行n列的一个方阵&#xff0c;使方阵中每一行…

大部分Intel hardware intrinsic 将在 .NET Core 2.1 中启用

编者注&#xff1a;SIMD via C# 引入了一套全新的机制&#xff0c;使得C# 以后可以像C/C 一样直接使用intrinsic functions 来直接操作Intel CPU 的大多数SIMD 指令了&#xff08;从SSE 到AVX2&#xff09;随着 .NET Core 2.1 发布的临近&#xff0c;上周CoreCLR 已经停止向mas…

运动员最佳配对问题

西安交大 软件53 蔡少斐 题号&#xff1a;6_5 题目叙述&#xff1a; 羽毛球队有男女运动员各n人。 给定2个nn矩阵P和Q。P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势&#xff1b;Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势。 由于技术配合…

P2217-[HAOI2007]分割矩阵【dfs,记忆化搜索】

正题 题目链接:https://www.luogu.org/problem/P2217 题目大意 a∗ba*ba∗b的矩阵&#xff0c;分成nnn个矩阵&#xff0c;求每个矩阵均方差最小&#xff0c;求答案。 解题思路 切n−1n-1n−1刀 设fk,x1,y1,x2,y2f_{k,x1,y1,x2,y2}fk,x1,y1,x2,y2​表示矩阵(x1,y1,x2,y2)(x1,y…

play框架入门操作

Play的基本特性&#xff1a;1、Play框架使用REST的开发风格&#xff0c;不用严格按照复杂的J2EE规范&#xff0c;是Java敏捷开发的首选。2、Play框架提供多种支持&#xff1a;NIO&#xff0c;JPA&#xff0c;Groovy以及各种工具类。3、Play框架会自动编译Java源文件&#xff0c…

动态规划练习1 [导弹拦截]

【问题描述】 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然 它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到 敌国的导弹来袭。由于该…

TensorflowSharp 简单使用与KNN识别MNIST流程

机器学习是时下非常流行的话题&#xff0c;而Tensorflow是机器学习中最有名的工具包。TensorflowSharp是Tensorflow的C#语言表述。本文会对TensorflowSharp的使用进行一个简单的介绍。本文会先介绍Tensorflow的一些基本概念&#xff0c;然后实现一些基本操作例如数字相加等运算…

1、jquery事件绑定和委托的实现

jQuery的事件绑定和委托可以使用 on()、one()、bind()、live()、delegate()等方法实现。 1、on() &#xff1a; 语法&#xff1a;$(selector).on(event,childSelector,data,function) 作用&#xff1a;可以在被选元素及子元素上添加一个或多个事件处理程序&#xff0c;并且…

刷题bingo挑战赛1

前言 为了提高做题效率&#xff0c;最近发现了个玩bingo的好网站 https://bingosync.com 然后就有了这场bingobingobingo赛。 正题 生成代码 [ {"name":"P2638"},{"name":"P4265"},{"name":"P2331"},{"n…

动态规划练习2 [合唱队形]

N 位同学站成一排&#xff0c;音乐老师要请其中的 (N-K) 位同学出列&#xff0c;使得剩下的 K 位同学排成合唱队形。 合唱队形是指这样的一种队形&#xff1a;设 K 位同学从左到右依次编号为 1 &#xff0c; 2 …&#xff0c; K &#xff0c;他们的身高分别为 T1 &#x…

ASP.NET Core Web 支付功能接入 微信-扫码支付篇

这篇文章将介绍ASP.NET Core中使用 开源项目 Payment&#xff0c;实现接入微信-扫码支付及异步通知功能。开发环境&#xff1a;Win 10 x64、VS2017 15.6.4、.NET Core SDK 2.1.101、.NET Core Runtime 2.0.61.新建"ASP.NET Core Web 应用程序"项目&#xff0c;我将它…

jzoj3832-在哪里建酿酒厂【指针】

正题 题目链接:https://jzoj.net/senior/#main/show/3832 题目大意 一个环形的&#xff0c;知道每个城市分布的位置和需要的酒数。然后要求在一个位置建厂使得运输价格最低。 解题思路 我们将数据复制一份放到后面&#xff0c;然后枚举建厂位置。我们现在要找到一个包含该位…

14、java中的集合(1)

1、为什么使用集合 面向对象语言使用对象体现事物&#xff0c;存储对象可以使用数组&#xff0c;但是数组的长度是固定的&#xff0c;存储的对象类型单一&#xff0c;不适用需求的变化&#xff0c;所以提供了集合。 2、集合和数组的区别 1&#xff09;数组长度定义之后不能改…

动态规划练习3 [砝码称重]

【问题描述】 设有 1g 、 2g 、 3g 、 5g 、 10g 、 20g 的砝码各若干枚&#xff08;其总重 <1000 &#xff09;&#xff0c;用他们能称出的重量的种类数。 【输入文件】 a1 a2 a3 a4 a5 a6 &#xff08;表示 1g 砝码有 a1 个&#xff0c; 2g 砝码有 a2 个…

Microsoft AI - Custom Vision in C#

概述前面一篇 Microsoft AI - Custom Vision 中&#xff0c;我们介绍了 Azure 认知服务中的自定义影像服务&#xff1a;Custom Vision&#xff0c;也介绍了如果通过这个在线服务&#xff0c;可视化的完成项目创建、数据集上传和标注、模型训练、模型评估和测试。我们也提到&…

jzoj3833-平坦的折线【模型转换,LIS】

正题 题目链接:https://jzoj.net/senior/#contest/show/2930/3 题目大意 一个平面直角坐标系上有nnn个点&#xff0c;如果两个点之间斜率在−1∼1-1\sim 1−1∼1之间那么就可以连接&#xff0c;求最少多少条折线可以连接这些点。 解题思路 我们将整个坐标系逆时针选择45∘(4…

22、mysql主键自增值和偏移量的查看和修改

1、查看mysql自增值和偏移量 show variables like %increment%; auto_increment_increment1 -- 自增倍数是1 auto_increment_offset1 -- 偏移量是1 上边这是一般的设置&#xff0c;每次每次主键自增的倍数是1&#xff0c;偏移量是1 例如&#xff1a;插入第n条记录&#x…

动态规划训练5 [回文词]

【问题描述】 回文词是一种对称的字符串——也就是说&#xff0c;一个回文词&#xff0c;从左到右读和从右到左读得到的结果是一样 的。任意给定一个字符串&#xff0c;通过插入若干字符&#xff0c;都可以变成一个回文词。你的任务是写一个程序&#xff0c;求出将 给定字符串变…