求连续子数组的最大和
问题描述:
设有1g,2g,3g,5g,10g,20g的砝码各若干枚(其总重≤1000g),要求:
输入:
a1 a2 a3 a4 a5 a6(表示1g砝码有a1个,2g砝码有a2个,......20g砝码有a6个)
输出:
Total=N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
输入样例:1 1 0 0 0 0
输出样例:Total=3,表示可以称出1g,2g,3g三种不同的重量
动态规划求解:
从砝码1开始分析,假设前i个砝码能称出的不同重量为Q[i],那么Q[i]一定是这样计算出来的:在Q[i-1]的基础上,对Q[i-1]个不同的重量,分别添加k个砝码i,再添加的过程中除去重复情况。
假设:w[N]表示N个不同重量的砝码(例子中N=6),w[0~N-1]。
c[N]表示N个不同砝码相应的数量,c[1~N]。
则:Q[i] = (Q[i-1] + k*w[i])-添加过程中重复的个数。其中0=<k<=c[i]。
定义一个辅助布尔型数组visit[M+1],这里的M是例子中的1000,表示最大重量不超过M。
visit[j]=1表示,重量为j的情况已经存在,否则表示重量为j的情况还未出现。其中visit[0]作为一个多余空间存在,可以作为一个临时变量。最后遍历visit[1~M],统计1的个数就得到不同重量的个数。
通过这个辅助数组,就可以除去重复情况,实现如下:
- 1 #include <iostream>
- 2 using namespace std;
- 3 #define N 6
- 4 #define M 1000
- 5 int w[N]={1,2,3,5,10,20};
- 6 int c[N]={0};
- 7 int visit[M+1] = {0};
- 8
- 9 int weight_count()
- 10 {
- 11 int i = 0;
- 12 int j = 0;
- 13 int total = 0;
- 14 int count =0;
- 15
- 16 visit[0] = w[0]*c[0];//visit[0]用于每添加一个砝码时遍历的结束位置
- 17 for(i = 1;i<=c[0];i++)
- 18 visit[w[0]*i] = 1;//初始化visit[1~c[0]],表示已经添加了砝码1
- 19 for(i = 1;i<N;i++)
- 20 {
- 21 int m = visit[0];
- 22 for(int k = 1;k<=c[i];k++)
- 23 {
- 24 for(j = 0;j<=m;j++)
- 25 {
- 26 if(j+ k*w[i]>M)
- 27 break;
- 28 if(visit[j] == 1 && visit[j + k*w[i]] != 1 || j==0)
- 29 {
- 30 visit[j + k*w[i]] = 1;
- 31 total = j+k*w[i];
- 32 }
- 33 }
- 34 }
- 35 visit[0] = total;
- 36 }
- 37 for(i = 1;i<=M;i++)
- 38 {
- 39 if(visit[i]==1)
- 40 {
- 41 cout << i << " ";
- 42 count ++;
- 43 }
- 44 }
- 45 return count;
- 46
- 47 }
- 48 int main()
- 49 {
- 50 int i = 0;
- 51 for(i = 0;i<N;i++)
- 52 cin >>c[i];
- 53 int count = weight_count();
- 54 cout << count << endl;
- 55 }
求连续子数组的最大和相关推荐
- 算法--三种方法求连续子数组的最大和
这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子 ...
- php取数组中连续数,PHP实现求连续子数组最大和问题2种解决方法
本文实例讲述了PHP实现求连续子数组最大和问题2种解决方法.分享给大家供大家参考,具体如下: 问题描述 求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整 ...
- 连续子数组的最大和python_连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求元素和值最大的那个子数组的和值. C#实现:public static int FindGreatestSum ...
- 【最佳解法】剑指 Offer 42. 连续子数组的最大和
我是小张同学,立志用最简洁的代码做最高效的表达 思路:动态规划 假设nums\textit{nums}nums 数组的长度是 nnn,下标从 000 到 n−1n-1n−1. 我们用 f(i)f(i) ...
- [剑指offer]面试题31:连续子数组的最大和
面试题31:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). ❖ 解法一:举例分析数组的 ...
- 算法题解:连续子数组的最大和及其下标
题目 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). 举例 输入:2, -3, 4, 5, -9 输出:9 和最 ...
- 剑指Offer面试题:28.连续子数组的最大和
一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3 ...
- 【剑指 offer】(31)—— 连续子数组的最大和(动态规划)
题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为 O(n)O(n). 例如,输入的数组为 {1, -2, 3, 10, ...
- 剑指 Offer 42. 连续子数组的最大和(官解)
14天阅读挑战赛 努力是为了不平庸~ 算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算 ...
最新文章
- MySQL中exists与in的使用
- Linux下 apache 配置 wsgi 以使用 python-flask (2016年2月)
- 设计模式之单例模式实践
- rabbitmq 延迟队列_框架系列|中间件RabbitMQ必看17道面试题
- 锁相环环路滤波器计算公式_锁相环计算方法
- 收藏!40 个 CSS 布局技巧
- react组件之间传递信息/react组件之间值的传递
- ESXi开启SSH的方法总结
- 王思聪吃热狗火了,程序员开发各种恶搞小程序!王校长:我不要脸的啊
- 使用ColorUI组件
- python 拆分excel单元格_python 操作excel
- BC #38 / HDU5208 Where is Bob · 数位dp
- 【LTE基础】SRVCC(Single Radio Voice Call Continuity 双模单待无线语音呼叫连续性)技术研究背景
- Android资源管理中的SharedLibrary和Dynamic Reference-------之AssetManager的处理(四)
- 关于Java的char类型,字符集,字符编码三者的关系
- 使用JAVA Apache POI对图片进行裁剪展示
- windows10图片打开找不到内置图片查看器
- dbus系列教程(2)理解dbus核心概念
- win7计算机cmd查看设备编码,查看windows操作系统的默认编码(字符集)
- 计算机英语刘艺课文bc翻译,《计算机英语》原文译文和习题答案 刘艺
热门文章
- 【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )
- 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )
- 【Android 逆向】代码调试器开发 ( ptrace 函数 | 读寄存器 | 写寄存器 )
- 【Flutter】屏幕像素适配方案 ( flutter_screenutil 插件 )
- 【错误记录】Flutter 界面跳转报错 ( Navigator operation requested with a context that does not include a Naviga )
- 【Android 内存优化】Bitmap 图像尺寸缩小 ( 设置 Options 参数 | inJustDecodeBounds | inSampleSize | 工具类实现 )
- 【Android 应用开发】Activity 任务亲和性 taskAffinity 设置 ( taskAffinity 属性 )
- 谈谈常用清除浮动的方法
- Java时间和时间戳的相互转换
- 使用squid配置透明代理并对上网行为进行控制