问题描述:

设有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的个数就得到不同重量的个数。

通过这个辅助数组,就可以除去重复情况,实现如下:

[cpp] view plaincopy
  1. 1 #include <iostream>
  2. 2 using namespace std;
  3. 3 #define N 6
  4. 4 #define M 1000
  5. 5 int w[N]={1,2,3,5,10,20};
  6. 6 int c[N]={0};
  7. 7 int visit[M+1] = {0};
  8. 8
  9. 9 int weight_count()
  10. 10 {
  11. 11         int i = 0;
  12. 12         int j = 0;
  13. 13         int total = 0;
  14. 14         int count =0;
  15. 15
  16. 16         visit[0] = w[0]*c[0];//visit[0]用于每添加一个砝码时遍历的结束位置
  17. 17         for(i = 1;i<=c[0];i++)
  18. 18                 visit[w[0]*i] = 1;//初始化visit[1~c[0]],表示已经添加了砝码1
  19. 19         for(i = 1;i<N;i++)
  20. 20         {
  21. 21                 int m = visit[0];
  22. 22                 for(int k = 1;k<=c[i];k++)
  23. 23                 {
  24. 24                         for(j = 0;j<=m;j++)
  25. 25                         {
  26. 26                                 if(j+ k*w[i]>M)
  27. 27                                         break;
  28. 28                                  if(visit[j] == 1 && visit[j + k*w[i]] != 1 || j==0)
  29. 29                                  {
  30. 30                                         visit[j + k*w[i]] = 1;
  31. 31                                         total = j+k*w[i];
  32. 32                                  }
  33. 33                         }
  34. 34                 }
  35. 35                 visit[0] = total;
  36. 36         }
  37. 37         for(i = 1;i<=M;i++)
  38. 38         {
  39. 39                 if(visit[i]==1)
  40. 40                 {
  41. 41                         cout << i << " ";
  42. 42                         count ++;
  43. 43                 }
  44. 44         }
  45. 45         return count;
  46. 46
  47. 47 }
  48. 48 int main()
  49. 49 {
  50. 50         int i = 0;
  51. 51         for(i = 0;i<N;i++)
  52. 52                 cin >>c[i];
  53. 53         int count = weight_count();
  54. 54         cout << count << endl;
  55. 55 }

求连续子数组的最大和相关推荐

  1. 算法--三种方法求连续子数组的最大和

    这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子 ...

  2. php取数组中连续数,PHP实现求连续子数组最大和问题2种解决方法

    本文实例讲述了PHP实现求连续子数组最大和问题2种解决方法.分享给大家供大家参考,具体如下: 问题描述 求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整 ...

  3. 连续子数组的最大和python_连续子数组的最大和

    题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求元素和值最大的那个子数组的和值. C#实现:public static int FindGreatestSum ...

  4. 【最佳解法】剑指 Offer 42. 连续子数组的最大和

    我是小张同学,立志用最简洁的代码做最高效的表达 思路:动态规划 假设nums\textit{nums}nums 数组的长度是 nnn,下标从 000 到 n−1n-1n−1. 我们用 f(i)f(i) ...

  5. [剑指offer]面试题31:连续子数组的最大和

    面试题31:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). ❖ 解法一:举例分析数组的 ...

  6. 算法题解:连续子数组的最大和及其下标

    题目 输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). 举例 输入:2, -3, 4, 5, -9 输出:9 和最 ...

  7. 剑指Offer面试题:28.连续子数组的最大和

    一.题目:连续子数组的最大和 题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n).例如输入的数组为{1,-2,3 ...

  8. 【剑指 offer】(31)—— 连续子数组的最大和(动态规划)

    题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为 O(n)O(n). 例如,输入的数组为 {1, -2, 3, 10, ...

  9. 剑指 Offer 42. 连续子数组的最大和(官解)

    14天阅读挑战赛 努力是为了不平庸~ 算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算 ...

最新文章

  1. MySQL中exists与in的使用
  2. Linux下 apache 配置 wsgi 以使用 python-flask (2016年2月)
  3. 设计模式之单例模式实践
  4. rabbitmq 延迟队列_框架系列|中间件RabbitMQ必看17道面试题
  5. 锁相环环路滤波器计算公式_锁相环计算方法
  6. 收藏!40 个 CSS 布局技巧
  7. react组件之间传递信息/react组件之间值的传递
  8. ESXi开启SSH的方法总结
  9. 王思聪吃热狗火了,程序员开发各种恶搞小程序!王校长:我不要脸的啊
  10. 使用ColorUI组件
  11. python 拆分excel单元格_python 操作excel
  12. BC #38 / HDU5208 Where is Bob · 数位dp
  13. 【LTE基础】SRVCC(Single Radio Voice Call Continuity 双模单待无线语音呼叫连续性)技术研究背景
  14. Android资源管理中的SharedLibrary和Dynamic Reference-------之AssetManager的处理(四)
  15. 关于Java的char类型,字符集,字符编码三者的关系
  16. 使用JAVA Apache POI对图片进行裁剪展示
  17. windows10图片打开找不到内置图片查看器
  18. dbus系列教程(2)理解dbus核心概念
  19. win7计算机cmd查看设备编码,查看windows操作系统的默认编码(字符集)
  20. 计算机英语刘艺课文bc翻译,《计算机英语》原文译文和习题答案 刘艺

热门文章

  1. 【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )
  2. 【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )
  3. 【Android 逆向】代码调试器开发 ( ptrace 函数 | 读寄存器 | 写寄存器 )
  4. 【Flutter】屏幕像素适配方案 ( flutter_screenutil 插件 )
  5. 【错误记录】Flutter 界面跳转报错 ( Navigator operation requested with a context that does not include a Naviga )
  6. 【Android 内存优化】Bitmap 图像尺寸缩小 ( 设置 Options 参数 | inJustDecodeBounds | inSampleSize | 工具类实现 )
  7. 【Android 应用开发】Activity 任务亲和性 taskAffinity 设置 ( taskAffinity 属性 )
  8. 谈谈常用清除浮动的方法
  9. Java时间和时间戳的相互转换
  10. 使用squid配置透明代理并对上网行为进行控制