题目链接:

http://lx.lanqiao.cn/problem.page?gpid=T136

问题描述
  对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?
输入格式
  第一行一个数表示数据组数
  每组输入数据共2行:
  第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
  第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。
输出格式
  每组数据输出1行,为最大的乘积。
样例输入
1
5 5
1 2 3 4 2
样例输出
48

一:首先要分离正负,两个负值乘积为正。做这道题时让我想起了按键盘http://blog.csdn.net/sm9sun/article/details/53241628

与其一样的是,按键盘保留大小写两种状态,那么本题也要保留正负最大值两种状态

二:类似于01背包,我们把m当作容量,每个数的体积都是1

这样一来每个数都面临取或者不取两种状态,当我们遍历到第i个物品时,我们要保留在i个物品中取j个物品的最大正负值即可

#include<stdio.h>
#include<math.h>
double fmax(double a,double b)
{return a>b?a:b;
}
double fmin(double a,double b)
{return a<b?a:b;
}
int main()
{double a[20];double fdp[20][20][20];double dp[20][20][20];int m,n,i,j,k,t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("%lf",&a[i]);for(i=0;i<=n;i++)  for(j=0;j<=m;j++)for(k=0;k<=j;k++){    dp[i][j][k]=1;fdp[i][j][k]=1;}fdp[0][1][1]=dp[0][1][1]=a[1];for(i=1;i<=n;i++)                   //遍历n个数{for(j=1;j<=m&&j<=i;j++)             //m为容量,从i个数中取j个数{for(k=1;k<=j;k++)           //k遍历当我容量上限为j时取不同个数的最大值,这里与01背包不同,取值必须达到m容量,不能小于{                           //所以每一个k都要记录下来if(a[i]>0){dp[i][j][k]=fmax(dp[i-1][j][k],dp[i-1][j-1][k-1]*a[i]);fdp[i][j][k]=fmin(fdp[i-1][j][k],fdp[i-1][j-1][k-1]*a[i]);}else{dp[i][j][k]=fmax(dp[i-1][j][k],fdp[i-1][j-1][k-1]*a[i]);fdp[i][j][k]=fmin(fdp[i-1][j][k],dp[i-1][j-1][k-1]*a[i]);}// printf("%.0lf,%.0lf ",dp[i][j][k],fdp[i][j][k]);}//printf("---");}//printf("\n");}printf("%.0lf\n",dp[n][m][m]);
}
return 0;
}

用dp思想的确可以解决这道题,不过后来看了网上的答案,发现其实还有更简单的方法,用贪心~

我们将正负数分组排序后,依次选取两个最大正值乘积,两个最大负值乘积即可~

注意,如果m为奇数时要再乘一个正数。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int main()
{int t, n, m;int num[20];scanf("%d", &t);while(t--){scanf("%d %d", &n, &m);for(int i = 0; i < n; i++)scanf("%d", &num[i]);sort(num, num+n);int i, j, a, b;i = j = 0;long long ans = 1;while(m){a = num[i]*num[i+1];b = num[n-j-1]*num[n-j-2];if(a>=b && m>=2){ans*=a;i+=2;m-=2;}else{ans*=num[n-j-1];j++;m--;}}printf("%lld\n", ans);}return 0;
}

所以说,也不能盲目的运用dp,有一些问题还是可以用贪心解决的。

动态规划——看似dp的贪心问题最大乘积(蓝桥杯试题集)相关推荐

  1. 动态规划——节点选择(蓝桥杯试题集)

    题目链接: http://lx.lanqiao.cn/problem.page?gpid=T14 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相 ...

  2. 动态规划——K号数(蓝桥杯试题集)

    题目链接:http://lx.lanqiao.cn/problem.page?gpid=T13 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求 ...

  3. P0404 阿尔法乘积 蓝桥杯

    算法提高 P0404 题目 时间限制:1.0s 内存限制:256.0MB 问题描述 计算一个无符号整数的阿尔法乘积.对于一个无符号整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的 ...

  4. 历届试题 包子凑数 C语言,蓝桥杯 试题 历届试题 包子凑数 dp+欧几里得算法

    问题描述 小明几乎天天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼刚好能放Ai个包子.每种蒸笼都有很是多笼,能够认为是无限笼. 每当有顾客想买X个包子,卖包子的大叔就会迅速选 ...

  5. 和与乘积 蓝桥杯国赛全真模拟测试卷(上)

    想要查看该套试卷的其它题解,请点击 题目描述 给定一个数列 A=(a1​,a2​,⋯,an​),问有多少个区间 [L,R] 满足区间内元素的乘积等于他们的和,即​⋅aL+1​*aR​=aL​+aL+1 ...

  6. 0x51.动态规划 - 线性DP(习题详解 × 10)

    目录 0x51.动态规划 - 线性DP 0x51.1 LIS问题 Problem A. 登山 (最长下降子序列) Problem B. 友好城市(思维) Problem C. 最大上升子序列和 0x5 ...

  7. 【LeetCode笔记】300. 最长递增子序列(Java、动态规划、二分法、贪心)

    文章目录 题目描述 思路 & 代码 动态规划 O(n2n^2n2) 动态规划 + 二分法 + 贪心 O(nlognnlognnlogn) 二刷 题目描述 难点在于时间复杂度 O(n * log ...

  8. 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)

    文章目录 动态规划算法(Dynamic Programming) 动态规划问题的属性 应用实例:最长公共子序列问题(Longest Common Subsequence, LCS) 贪心算法(Gree ...

  9. 算法设计与分析:贪心算法 - 排课问题(DP与贪心的区别与应用)

    文章目录 前言 贪心算法概念 排课问题 问题描述与分析 动态规划求解 简化问题应用贪心算法 总结 本文参考UCAS卜东波老师算法设计与分析课程撰写 前言 前面两大章节的内容分治思想与动态规划暂时告一段 ...

最新文章

  1. 字符串反转python_python字符串反转的四种方法详解
  2. Maven警告:“java使用了未经检查或不安全的操作。java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。“
  3. 假如有人把支付宝存储服务器炸了(附文末福利)
  4. 牛客练习赛71C-数学考试【容斥,dp】
  5. php最常用方法,php 常用方法
  6. 设置WordPress文章关键词自动获取,文章所属分类名称,描述自动获取文章内容,给文章的图片自动加上AlT标签...
  7. ASP.NET2.0导出Word文档(C#导出DOC)
  8. python内部函数和比外部函数快_Python:如何允许“内部函数”更改多个“外部函数”中的非局部变量...
  9. swoole2.0与java_swoole2.0试用说明
  10. linux curl获取头部信息,curl 命令如何获取 http header 返回的响应消息头
  11. php imagick下载,PHP安装imagemagick扩展imagick
  12. Android 控件之 Date Time 组件
  13. LINUX开机,直接进入终端,如何加载硬盘
  14. 介绍两种常见软件开发模式:“敏捷”和“瀑布”
  15. NTP时钟源(GPS时间源)介绍与分析
  16. 使用python3抓取链家二手房数据
  17. 这几年被分布式坑惨了,曝光十大坑
  18. linux环境下java输出乱码,linux java 输出乱码问题
  19. 由国内媒体的“非典”报道看信息生态问题-引文
  20. 七夕礼物 | 全网最火的钉子绕线图制作教程

热门文章

  1. 55 MM配置-评估和科目设置-定义账户分类参考
  2. SAP MM模块-实施顾问岗位-面试手册-MM模块技术面试清单
  3. 谷歌浏览器安卓_用谷歌服务更安全了,安卓手机可充当物理安全密匙
  4. PspNet在MMsegmentation框架下成功训练Pascal VOC2012数据集及踩坑实录
  5. Bootstrap-CSS-排版
  6. c语言位向量机伞_一文读懂C语言精华-指针变量和指向指针的指针
  7. bp 神经网络 优点 不足_基于粒子群算法和BP神经网络的多因素林火等级预测模型...
  8. 安装pytorch时,在安装 future-0.18.2.tar.gz (829 kB)时报错:ModuleNotFoundError: No module named ‘_ctypes’解决办法
  9. Ubuntu系统显卡驱动、CUDA、CUDNN安装(二CUDA和CUDNN)
  10. 解决http://localhost:3000/favicon.ico 的404 问题(含案例解析)