动态规划应用--双11购物凑单

文章目录

    • 1. 问题描述
    • 2. 代码实现

1. 问题描述

双11购物节的时候,某宝给你很多张满300减50的优惠券,你想组合各种商品的价格总和>=300,且金额总和越接近300越好,这样可以多薅点羊毛。

  • 回溯算法效率太低,时间复杂度指数级。当n很大的时候,可能“双11”已经结束了,代码还没有运行出结果

  • DP求解:购物车中有n个商品。针对每个商品都决策是否购买。每次决策之后,对应不同的状态集合。
  • 用一个二维数组 states[n][x],来记录每次决策之后所有可达的状态。不过,这里的x值是多少呢?
  • 0-1背包问题中,我们找的是小于等于MaxWeight的最大值,x 就是背包的最大承载重量 MaxWeight+1。
  • 对于这个问题来说,我们要找的是>=300(满减条件)的值中最小的,所以就不能设置为300加1了。就这个实际的问题而言,如果要购买的物品的总价格超过300太多,比如1000,那这个羊毛“薅”得就没有太大意义了。所以,我们可以限定x值为1001。
  • 这个问题不仅要求>=300的总价格中的最小的,还要找出这个最小总价格对应都要购买哪些商品。实际上,我们可以利用states数组,倒推出这个被选择的商品序列。

2. 代码实现

/*** @description: 双十一购物凑单(DP)* @author: michael ming* @date: 2019/7/17 0:29* @modified by: */
#include <cstring>
#include <iostream>const int limitMoney = 300;
const int MaxSumOfPrice = 3*limitMoney;//超过3倍就没有媷羊毛的必要了
void double11shopping(int *price, int n)
{bool (*states) [MaxSumOfPrice+1] = new bool [n][MaxSumOfPrice+1];memset(states,0,n*(MaxSumOfPrice+1)*sizeof(bool));states[0][0] = true;//第一个不买if(price[0] <= MaxSumOfPrice)states[0][price[0]] = true;//第一个买int i, j;for(i = 1; i < n; ++i)//动态规划{for(j = 0; j <= MaxSumOfPrice; ++j)//不买第i个商品{if(states[i-1][j] == true)states[i][j] = states[i-1][j];}for(j = 0; j <= MaxSumOfPrice-price[i]; ++j)//购买第i个商品{if(states[i-1][j] == true)states[i][j+price[i]] = true;}}for(j = limitMoney; j <= MaxSumOfPrice; ++j){if(states[n-1][j] == true)break;//找到>=满减金额的最小值}if(j == MaxSumOfPrice+1)return;//超出满减金额很多,没必要选了,直接买吧for(i = n-1; i >= 1; --i)//打印该买的商品{if(j-price[i] >= 0 && states[i-1][j-price[i]] == true){std::cout << "购买价格为:" << price[i] << " 的商品" << std::endl;j = j - price[i];}//else 没有购买这个商品,j不变}if(j != 0)//如果没有买第0个,到这里j == 0了,如果j不为0,说明买了第0个std::cout << "购买价格为:" << price[0] << " 的商品" << std::endl;delete [] states;
}
int main()
{const int n = 5;int price[n] = {100,98,105,104,99};double11shopping(price,n);return 0;
}

打印所选商品说明:

  • 状态(i,j)只有可能从(i-1,j)或者(i-1,j-price[i])两个状态推导过来。所以,我们就检查这两个状态是否可达,也就是 states[ i-1 ][ j ] 或者 states[ i-1 ][ j-price[i] ] 是否是true。
  • 如果states[ i-1 ][ j ]可达,说明没有选择第i个商品,如果states[ i-1 ][ j-price[i] ] 可达,说明选择了第i个商品。从中选择一个可达的状态(如果两个都可达,就随意选择一个),然后,继续迭代考察其他商品是否有选择购买。

在这里插入图片描述

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

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

相关文章

商汤科技2020数据分析师0820笔试题目整理

2019年8月19日 问答题1&#xff1a;缺失值数据预处理有哪些方法&#xff1f;https://juejin.im/post/5b5c4e6c6fb9a04f90791e0c 处理缺失值的方法如下&#xff1a;删除记录&#xff0c;数据填补和不处理。主要以数据填补为主。 1 删除记录&#xff1a;该种方法在样本数据量十分…

Java多线程系列(八):ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)

HashMap、CurrentHashMap 的实现原理基本都是BAT面试必考内容&#xff0c;阿里P8架构师谈&#xff1a;深入探讨HashMap的底层结构、原理、扩容机制深入谈过hashmap的实现原理以及在JDK 1.8的实现区别&#xff0c;今天主要谈CurrentHashMap的实现原理&#xff0c;以及在JDK1.7和…

论文笔记(Neural Graph Collaborative Filtering)

神经图协同过滤 论文链接&#xff1a;Neural Graph Collaborative Filtering, SIGIR’19 原理&#xff1a;在 user-item interaction graph 上使用 GNN 来学习 user 向量和item 向量&#xff0c;用户向量和项向量的内积来预测评分。 区别&#xff1a; 大部分论文使用 GNN 只是…

论文浅尝 | 基于知识库的自然语言理解 02#

本文转载自公众号&#xff1a;知识工场。罗康琦&#xff0c;上海交通大学计算机系2019届博士&#xff0c;研究方向为自然语义理解和知识图谱。2012年获得华中科技大学软件工程学士学位&#xff0c;现就职于京东数据科学实验室&#xff08;Data Science Lab&#xff09;。他曾在…

工业解密:百度地图背后的路线时长预估模型!

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术编 | YY无论你是苦逼学生&#xff08;公交地铁狗&#xff09;、职场萌新&#xff08;打车狗&#xff09;还是有钱大佬&#xff08;有车一族&#xff09;&#xff0c;只要站在了北上广深的土地上&#xff0c;就…

动态规划应用--“杨辉三角”最短路径 LeetCode 120

文章目录1. 问题描述2. DP算法代码3. LeetCode 120 三角形最小路径和1. 问题描述 对“杨辉三角"进行一些改造。每个位置的数字可以随意填写&#xff0c;经过某个数字只能到达下面一层相邻的两个数字。 假设你站在第一层&#xff0c;往下移动&#xff0c;我们把移动到最底…

Java多线程系列(九):CountDownLatch、Semaphore等4大并发工具类详解

之前谈过高并发编程系列&#xff1a;4种常用Java线程锁的特点&#xff0c;性能比较、使用场景 &#xff0c;以及高并发编程系列&#xff1a;ConcurrentHashMap的实现原理(JDK1.7和JDK1.8) 今天主要介绍concurrent包的内容以及4大并发工具类。 Java并发工具包 1.并发工具类 …

快手 算法工程师 0825 笔试题

4 求解一元一次方程的解 #include <cstdio> #include <iostream> #include <string.h> #include <cstring> #include <algorithm> using namespace std; int x0,n0,xr0,nr0; int flag 0; void Adds(string a,char op) { if(flag0) {if(a…

论文笔记(Neural Collaborative Filtering)

神经协同过滤 论文链接&#xff1a;Neural Collaborative Filtering, WWW’17 原理&#xff1a;融合 GMF 和 MLP 1. 摘要 虽然最近的一些研究使用深度学习作为推荐&#xff0c;但他们主要是用深度学习来建模辅助信息&#xff0c;例如 item 的文本描述。在表示协同过滤的关键…

玩转算法第七章-二叉树与递归

二叉树与递归 二叉树的前序遍历 leetcode 104 将两个递归函数映射到max函数中去 思考题&#xff1a;leetcode 111 leetcode&#xff1a;226 扩展题&#xff1a;leetcode 100 leetcode&#xff1a;101 第一个是&#xff0c;第二个不是 leetcode 222&#xff1a; leet…

POJ 2965 开冰箱的门(回溯)

文章目录1. 题目1.1 题目链接1.2 题目大意1.3 解题思路2. 代码2.1 Accepted代码1. 题目 1.1 题目链接 http://poj.org/problem?id2965 1.2 题目大意 有一个4*4的符号矩阵&#xff08;和-&#xff09;&#xff0c;改变一个元素的符号&#xff0c;它所在的行和列的其他元素也…

论文浅尝 | 基于知识库的自然语言理解 03#

本文转载自公众号: 知识工场。罗康琦&#xff0c;上海交通大学计算机系2019届博士&#xff0c;研究方向为自然语义理解和知识图谱。2012年获得华中科技大学软件工程学士学位&#xff0c;现就职于京东数据科学实验室&#xff08;Data Science Lab&#xff09;。他曾在AAAI&#…

Java多线程系列(七):并发容器的原理,7大并发容器详解、及使用场景

之前谈过高并发编程系列&#xff1a; 高并发编程系列&#xff1a;4种常用Java线程锁的特点&#xff0c;性能比较、使用场景 高并发编程系列&#xff1a;CountDownLatch、Semaphore等4大并发工具类详解 高并发编程系列&#xff1a;4大JVM性能分析工具详解&#xff0c;及内存…

MSRA提出通用文档预训练模型LayoutLM,通往文档智能之路!

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术随着数字化进程的加快&#xff0c;文档、图像等载体的结构化分析和内容提取成为关乎企业数字化转型成败的关键一环&#xff0c;自动、精准、快速的信息处理对于生产力的提升至关重要。以商业文档为例&#xf…

tensorflow--GPU

一、查看 tensorflow 是否使用了GPU进行计算 import tensorflow as tf sess tf.Session(configtf.ConfigProto(log_device_placementTrue)) 运行程序&#xff0c;日志若包含 gpu 信息&#xff0c;则使用了 gpu。 二、使用指定GPU 方式一&#xff1a;代码&#xff1a; imp…

玩转算法之面试 第八章-递归与回溯

树形问题 leetcode&#xff1a;17 1 字符串的合法性 &#xff08;是否包括1&#xff0c;*和#号键&#xff09; 2 空字符串 3 多个解的顺序 部分源代码如下&#xff1a; 在这里插入代码片 #include<cstring>using namespace std;private:const string letterMap[1…

动态规划理论学习

文章目录1. 理论总结1.1 “一个模型”1.2 “三个特征”1.2.1 最优子结构1.2.2 无后效性1.2.3 重复子问题2. 实例剖析2.1 问题描述2.2 两种DP解题思路2.2.1 状态转移表2.2.2 状态转移方程3. 四种算法思想比较1. 理论总结 动态规划理论总结为“一个模型、三个特征”。 1.1 “一…

Java多线程系列(四):4种常用Java线程锁的特点,性能比较、使用场景

多线程的缘由 在出现了进程之后&#xff0c;操作系统的性能得到了大大的提升。虽然进程的出现解决了操作系统的并发问题&#xff0c;但是人们仍然不满足&#xff0c;人们逐渐对实时性有了要求。 使用多线程的理由之一是和进程相比&#xff0c;它是一种非常花销小&#xff0c;切…

论文浅尝 | Global Relation Embedding for Relation Extraction

链接&#xff1a;https://arxiv.org/abs/1704.05958Introduction在关系抽取任务中&#xff0c;通常采用远程监督的方式自动生成数据集。由于实体对间可能存在多关系&#xff0c;生成的数据集往往存在大量噪音。本文对文本中的关系表述&#xff08;textual relation&#xff09;…

tensorflow--模型的保存和提取

参考&#xff1a; TensorFlow&#xff1a;保存和提取模型 最全Tensorflow模型保存和提取的方法——附实例 模型的保存会覆盖&#xff0c;后一次保存的模型会覆盖上一次保存的模型。最多保存近5次结果。应当保存效果最优时候的模型&#xff0c;而不是训练最后一次的模型。所以…