文章目录

  • 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个商品。从中选择一个可达的状态(如果两个都可达,就随意选择一个),然后,继续迭代考察其他商品是否有选择购买。

动态规划应用--双11购物凑单相关推荐

  1. 双11购物超A股单日成交

    双十一购物和买A股最大的差别,就是A股消费者不能在第二天取消订单说:把钱还我,我不玩了. 一种类似于股票市场牛市来了一样的仪式性购物狂热行为,在上周末落下帷幕.中国内地两家最大的电商网站天猫和京东,以 ...

  2. 护航Lazada双11购物节 阿里云CDN全球化火力全开

    2018年11月12日零点--东南亚最大的电子商务公司Lazada 2018双11购物节正式收官.这是一场超过2000万的消费者在Lazada网站上及APP上浏览和疯狂抢购的盛会. Lazada是东南 ...

  3. 【报告分享】2009-2019年“双11”购物节关键数据盘点与发展趋势分析报告.pdf(附下载链接)

    不知不觉"双11"购物节已经十周年了,你还记得当年的光棍节吗?今天就来给大家分享并回顾下这个中国特色的节日. 今天分享的报告来自前瞻产业研究院于2019年11月发布的主题研究报告& ...

  4. 2022年天猫双11购物节,10月24日晚8点预售来袭

    2022年天猫双11购物节,10月24日晚8点预售来袭 这对于爱网购的小姐姐们一定都知道接下来会发生什么事情了,双11第一波预售将至,我们可以为买衣服鞋帽做清单了,据天猫的微博了解,2022年的天猫双 ...

  5. 2021年京东双11购物节如何买才能最优惠?京东双11优惠规则规则

    2021年京东双11购物节如何买才能最优惠?京东双11优惠规则规则 2021年"双11"已经打响了第一枪.10月17日,京东举行"双11"大促发布会," ...

  6. 双11购物节火热,谨防木马乘机而入

    腾讯电脑管家 · 2015/11/12 16:24 0x00 概况 近期11.11购物节,无数的网页.软件都充斥着"血拼双11"的广告,这时的电脑桌面如果多了几个双11相关的快捷方 ...

  7. “双11”购物狂欢节,所有女生走进了谁的直播间?

    昨晚,你又双叒叕"剁手"了吗? 众所周知,昨晚是一年一度的"双11",而今年的玩法比较特殊,从狂欢节升级为狂欢季,锁定11月1日和11月11日,两天. 这句&q ...

  8. 一款告诉你历史价格的插件,双11购物必备!

    大家好,我是TJ 一个励志推荐10000款开源项目与工具的程序员 双11就快到啦,但实际上双11的促销活动从前几天就开始了,相信许多小伙伴已经买了不少心仪的物品,不过TJ君在淘宝.京东购物的时候经常会 ...

  9. 一款告诉你历史价格的插件,双11购物神器!

    在剁手党眼里,每年的天猫双11是电商一年中最重要也是最后收尾的大力度促销期,在这一天可以尽情的买买买. 在运营汪心里,双十一是一年里最盛大的电商阅兵,各家电商都会排兵布阵做出不一样的精彩.主场作战的阿 ...

最新文章

  1. python编程下载安卓版-python编程入门
  2. ios打包报错:User interaction is not allowed
  3. CG CTF WEB 层层递进
  4. Apache Flink 零基础入门(四)Flink开发批处理应用程序
  5. 强烈推荐:SiteServer CMS开源免费的企业级CMS系统!
  6. Socket网络编程--小小网盘程序(1)
  7. 使用Docker部署RabbitMQ集群
  8. “人,年轻时一定要去大公司、大城市奋斗”你怎么看?
  9. php ajax国家时间,php ajax 实时显示时间
  10. DXUT框架剖析(9)
  11. 在springBoot项目中使用activiti
  12. CCS历代版本下载地址以及6.0以上版本添加软件仿真
  13. QCC3024/QCC3020/QCC3034 对讲机(Intercom) 蓝牙耳机 替代CSR8670
  14. 如何成为数据分析师?小白这样做,快速入门数据分析
  15. 基于Patachmatch的stereo matching笔记(一):《PatchMatch Stereo》
  16. 第9章 数据库完整性
  17. 一、大数据_课程导论(P2~P6)
  18. 【k8s金牌知识】k8s升级攻略
  19. 【IoT】 产品设计:产品工艺之金属外壳CNC加工过程
  20. 用C++模拟大数的除法 ————墨白

热门文章

  1. 打印英文年历C语言函数,C语言打印年历
  2. mysql current_timestamp 不自动更新_MySQL ON UPDATE CURRENT_TIMESTAMP不更新
  3. 华为鸿蒙消费者,王成录谈鸿蒙挑战和华为消费者业务崛起
  4. oracle模拟重叠事务,ORACLE的事务读一致性与语句读一致性
  5. VS 使用 :新建项目
  6. 逆波兰表达式[栈 C 语言 实现]
  7. redis -- 学习
  8. Android WebView常见问题及解决方案汇总【很全很实用】
  9. easyUI文本框textbox笔记
  10. gcc和g++有什么区别?