`
明九_
  • 浏览: 2198 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

N个数,求小于K的最大子序列之和

阅读更多
曾几何时,姐姐我一看到这样的题目就倍感头痛。然而,昨日受到启发,忽然想起了模仿二级制可以表示穷举法。兴奋得彻夜难眠,一早就爬起来,实现了该代码。
具体分析如下:
首先,题目有两个判断因素:小于N,最大。
我想到了一个做笨的方法,将N个数所有可能的子序列相加,看看每个之和是否小于k,如果满足这个条件,就放入result中。接下来,每次循环,得到的和都跟result进行比较。只要它小于k并且大于result,就将最新的和赋值给result。
那么如何模拟穷举呢?
我今天忽然想起了,一个n位数,如果每位上都可能是0、1,把所有的0、1排列都组合起来,那么就囊括了所有情况。也就是说,只要模拟出n位数的所有二进制效果,就能得到所有的子序列的可能性。利用这个二级制表示所有可能性,只要是位数上是1的,就把该位对应的那个数加进sum里。每轮循环都是一个不同的二进制数,当所有的二进制跑完一遍,各种可能性都走过了,实现了穷举。
ok,穷举表示的方法解决了,那么就可以动手写代码了。
C语言代码如下:
#include <stdio.h>
#include <stdlib.h>

int multi(int n){
  int i,k=1;
  for(i=1;i<=n;i++){
    k=k*2;
  }
  return k;
}

int qiongju(int *list,int start,int end,int standard){
  int bit = end-start+1,result=0;
  int count=0,j,maxOfAllBit=0;
  for(j=0;j<bit;j++){
    maxOfAllBit += multi(j);
  }
  printf("the all bit max:%d\n",maxOfAllBit);
  int array[bit];
  int flag=0;
  while(count<=maxOfAllBit){
    int temp=count,i=0;
    do{
      array[i++]= temp%2;
      temp = temp/2;
      }while(temp>0 && i<bit);
    while(i<bit){
      array[i++]=0;
    }
    int k,sum=0;
    for(k=0;k<bit;k++){
      printf("%d ",array[k]);
      if(array[k]==1){
        sum += list[k];
      }
    }
    printf("%d\n",sum);
    count++;
    if(sum<standard){
      if(flag == 0){
        result = sum;
        flag++;
      }
      else if(sum>result){
        result = sum;
      }
    }
  }
  return result;    
}

int  main(){
  //int array[10]={1,3,9,2,8,4,5,9,11,2};
  //int k = 27;
  int array[5]={4,1,3,6,7};
  int k=10;
  int result = qiongju(array,0,4,k);
  printf("%d\n",result);
  system("pause");
  return 0;
}



可以看到,我把每个二进制数产生的结果都打印出来了,每个二进制行的末尾多了一个数,是该行所有位数为1的二级位对应的数之和,方便自己调试查看的。
array就待计算数组,具体功能在qiongju函数中。
这个算法还有很多不完善的地方,有空我将进行下一步完善。
分享到:
评论

相关推荐

    动态规划-作业-西南交通大学-实验5.4预习报告

    在本实验中,动态规划被应用来求解两个主要问题:最大子序列和以及最大子矩阵和。 首先,我们来看**最大子序列和**。这是一个经典的动态规划问题,通常称为Kadane's Algorithm。在给定的序列中,目标是找到一个连续...

    数据结构与算法分析C代码

    #### 最大子序列和问题 最大子序列和问题是数据结构与算法中一个经典的计算机科学问题,涉及到在一维数组中寻找连续子序列的最大和。 #### Cubic Algorithm 这是一种时间复杂度为 O(n^3) 的解决方案: ```c int ...

    数据结构C问题

    解决这个问题通常采用深度优先搜索策略,通过递归地计算左右子树的高度,然后将左右子树高度之和作为当前节点处的最大距离候选值,与左右子树中的最大距离进行比较,从而得到最终答案。 以上只是“数据结构C问题”...

    常见:微软公司等数据结构+算法面试100题(第1-100题)全部出炉1

    4. **子数组最大和**:也称为“最大子序列和”问题,是动态规划的经典应用。通过计算每个位置的当前和与前一个位置的和,可以找到具有最大和的子数组,时间复杂度为O(n)。 5. **二元树中和为某一值的路径**:在二元...

    【史上最全】算法面试题集锦.pdf

    这个问题通常被称为最大子数组和问题。其核心思想是用一个变量来记录当前子数组的最大和,并不断更新这个值。使用Kadane算法可以在O(n)时间复杂度内解决问题。算法的核心是遍历数组,将当前元素加到当前子数组和中,...

    LeetCode练习答案

    - **最大子数组和(Maximum Subarray)**: 给定一个整数数组,找到一个具有最大和的连续子数组(至少包含一个数),返回其最大和。 - **爬楼梯(Climbing Stairs)**: 每次可以爬1或2个台阶,求出爬上n阶楼梯的不同方法...

    100 questions by_july

    - 使用动态规划的方法来解决这个问题,可以用一个变量来记录当前连续子数组的和,同时用另一个变量来记录最大子数组的和。 - 从左至右遍历数组,对于每一个位置i,考虑两种情况:将当前位置i的元素加入到之前的最大...

    ACM_算法模板集.pdf

    - 定义:一种用于组合数学中的数,用来计算将$n$个不同元素分成$k$个非空集合的方法数量。 - 公式:${n \brace k}$。 - **贝尔数 (Bell Number)** - 定义:表示将$n$个不同元素划分为若干个不相交子集的方法数。 ...

    ACM编程题模板和各种经典算法数据结构实现代码

    - 组合数C(N,R)表示从N个不同元素中取出R个元素的组合数。 14. **最大1矩阵** - 最大1矩阵问题是指在一个由0和1组成的矩阵中寻找最大的全1子矩阵。 15. **约瑟夫环问题** - 约瑟夫环问题是一个经典的组合问题...

    算法导论第三版_英文版

    1. **分解:** 将两个n×n的矩阵A和B各自分割成四个n/2×n/2的小矩阵。 2. **递归计算:** 使用递归的方式计算出这四个小矩阵的乘积。 3. **合并:** 通过对这四个小矩阵的结果进行特定的加减运算,得到最终的矩阵...

    leetcode1004-MaxConsecutiveOnesIII-Leetcode-1004:一种使用滑动窗口方法来查找最大子数组的算法,

    这个问题属于中等难度,旨在考察我们对数据结构和算法的理解,特别是滑动窗口方法的应用。滑动窗口是处理数组或字符串问题时的一种强大技巧,常用于寻找子序列的最值或者特定条件下的子序列。 题目描述如下:给定一...

    算法参考手册 实用

    - **幻方的定义:** 一个n×n的方阵,其中每一行、每一列以及两条对角线上的数字之和相等。 - **幻方构造方法:** 如基于递归的方法。 **13.6 模式匹配(kmp)** - **KMP算法的基本原理:** 通过预处理模式串的...

    java算法与数据结构

    - **二叉编码树**:每个叶子节点代表一个字符,并且有一个权值与之对应。 **6.5.2 Huffman树及Huffman编码** - **Huffman树**:通过构建最优二叉树来实现高效的编码方案。 - **Huffman编码**:一种变长编码技术,...

Global site tag (gtag.js) - Google Analytics