征集算法

looky9 2009-01-13 11:26:38
才工作不久就遇见一个让人头痛的算法题,想了一段时间也没想出来。在这提出来供大家参考,如果谁有好的算法来解决此问题,不胜感激。
某公司有M种商品供销售,现要进行促销活动,此促销活动分N个子促销方式,每个子促销方式为:由X种商品组成,客户需要购买全部X种商品且这X种商品的购买数量需满足Y[z]中的数量(Y[1]...Y[n]对应X[1]....X[n])才能获得K个赠品,客户可以同时参与所有N个子促销。在客户购物结束时候计算客户所能得到做多的赠品数。
例如:客户购买方案:10个A,6个B,4个C,8个D。促销方案:买3个A,3个B,3个C 送4个G;1个A,4个C 送2个G;2个B,2个C 送3个G;2个A,2个E 送2个G。计算客户能最多得到多少个赠品。
...全文
1062 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
a88015056 2009-03-03
  • 打赏
  • 举报
回复
这问题很简单的。LINGO软件是最理想的处理线性代数问题的工具。而且你这只是一次的而已。不要及分钟就可以求出。
fire_woods 2009-02-19
  • 打赏
  • 举报
回复
是个线性规划问题.
sincor 2009-01-16
  • 打赏
  • 举报
回复
学习 动态规划
pengfu008 2009-01-15
  • 打赏
  • 举报
回复
晕,谁会的说下,我也想学习下
  • 打赏
  • 举报
回复
应该用动态规划比较合适.
kingork 2009-01-14
  • 打赏
  • 举报
回复
回贴 就有10分
绿色夹克衫 2009-01-13
  • 打赏
  • 举报
回复
比较复杂,0-1背包可能有点问题吧,一个方案可以选多次,动态规划应该可以,但方案较多,
购买数量比较庞大的时候,计算量也是挺可观的。我觉得用贪心也有可能解。
  • 打赏
  • 举报
回复
这其实就是个整数规划问题,可以用动态规划的思路来解决,但效率不会高到哪里去(本身这个问题就是NP难的),还不如直接回溯剪枝来得痛快:
拿你举的例子来说,就是在下面矩阵中抽取若干行,使得子矩阵每列的和不超过[10 6 4 8 0]的限制:
[3 3 3 0 0] -获赠4个
[1 0 4 0 0] -获赠2个
[0 2 2 0 0] -获赠3个
[0 2 2 0 0] -获赠3个
你的目的就是要找出其中赠品和最大的子矩阵方案。

矩阵的构造也很简单,根据某个促销方案和你要购买各种商品的数量,得出这种促销方式最多能使用几次(在矩阵中重复出现几行)。
拿例子中“2个B,2个C 送3个G”这个活动来说,它最多可以参加2次,所以在矩阵中重复出现了2行;
同样的道理,“2个A,2个E 送2个G”这个活动在矩阵中根本就没有出现。
test4ever 2009-01-13
  • 打赏
  • 举报
回复
你这个多维的向量要复杂一点,
可以计算权值将多维向量变为一维向量,
然后使用0-1背包,动态规划
test4ever 2009-01-13
  • 打赏
  • 举报
回复
错了
如果不可以
动态规划
test4ever 2009-01-13
  • 打赏
  • 举报
回复
可以重复参加同一种自促销么?
如果可以

动态规划
  • 打赏
  • 举报
回复
贪心算法不合适,并不能保证得到的一定就是最优解。
只是在某些特殊的情况下有可能进行一定的优化,当然如果你是在说近似解法那又是另一回事了。

n种促销活动,假设每种活动得到的赠品数量是G[i]、参加的次数是A[i](1<=i<=n),
那么在满足参加各种促销购买的商品数量没有超出用户购买计划的同时(m个不等式),还要求
max{∑G[i]*A[i](1<=i<=n)}
这是个标准的线性整数规划问题。
如果楼主感兴趣,可以去看一些有关运筹学的书籍,大多是用分支定界或者割平面的方法来解决这种问题。
当然上面说的回溯剪枝也是简单易行的方法。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧