曾几何时,姐姐我一看到这样的题目就倍感头痛。然而,昨日受到启发,忽然想起了模仿二级制可以表示穷举法。兴奋得彻夜难眠,一早就爬起来,实现了该代码。
具体分析如下:
首先,题目有两个判断因素:小于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函数中。
这个算法还有很多不完善的地方,有空我将进行下一步完善。
分享到:
相关推荐
在本实验中,动态规划被应用来求解两个主要问题:最大子序列和以及最大子矩阵和。 首先,我们来看**最大子序列和**。这是一个经典的动态规划问题,通常称为Kadane's Algorithm。在给定的序列中,目标是找到一个连续...
#### 最大子序列和问题 最大子序列和问题是数据结构与算法中一个经典的计算机科学问题,涉及到在一维数组中寻找连续子序列的最大和。 #### Cubic Algorithm 这是一种时间复杂度为 O(n^3) 的解决方案: ```c int ...
解决这个问题通常采用深度优先搜索策略,通过递归地计算左右子树的高度,然后将左右子树高度之和作为当前节点处的最大距离候选值,与左右子树中的最大距离进行比较,从而得到最终答案。 以上只是“数据结构C问题”...
4. **子数组最大和**:也称为“最大子序列和”问题,是动态规划的经典应用。通过计算每个位置的当前和与前一个位置的和,可以找到具有最大和的子数组,时间复杂度为O(n)。 5. **二元树中和为某一值的路径**:在二元...
这个问题通常被称为最大子数组和问题。其核心思想是用一个变量来记录当前子数组的最大和,并不断更新这个值。使用Kadane算法可以在O(n)时间复杂度内解决问题。算法的核心是遍历数组,将当前元素加到当前子数组和中,...
- **最大子数组和(Maximum Subarray)**: 给定一个整数数组,找到一个具有最大和的连续子数组(至少包含一个数),返回其最大和。 - **爬楼梯(Climbing Stairs)**: 每次可以爬1或2个台阶,求出爬上n阶楼梯的不同方法...
- 使用动态规划的方法来解决这个问题,可以用一个变量来记录当前连续子数组的和,同时用另一个变量来记录最大子数组的和。 - 从左至右遍历数组,对于每一个位置i,考虑两种情况:将当前位置i的元素加入到之前的最大...
- 定义:一种用于组合数学中的数,用来计算将$n$个不同元素分成$k$个非空集合的方法数量。 - 公式:${n \brace k}$。 - **贝尔数 (Bell Number)** - 定义:表示将$n$个不同元素划分为若干个不相交子集的方法数。 ...
- 组合数C(N,R)表示从N个不同元素中取出R个元素的组合数。 14. **最大1矩阵** - 最大1矩阵问题是指在一个由0和1组成的矩阵中寻找最大的全1子矩阵。 15. **约瑟夫环问题** - 约瑟夫环问题是一个经典的组合问题...
1. **分解:** 将两个n×n的矩阵A和B各自分割成四个n/2×n/2的小矩阵。 2. **递归计算:** 使用递归的方式计算出这四个小矩阵的乘积。 3. **合并:** 通过对这四个小矩阵的结果进行特定的加减运算,得到最终的矩阵...
这个问题属于中等难度,旨在考察我们对数据结构和算法的理解,特别是滑动窗口方法的应用。滑动窗口是处理数组或字符串问题时的一种强大技巧,常用于寻找子序列的最值或者特定条件下的子序列。 题目描述如下:给定一...
- **幻方的定义:** 一个n×n的方阵,其中每一行、每一列以及两条对角线上的数字之和相等。 - **幻方构造方法:** 如基于递归的方法。 **13.6 模式匹配(kmp)** - **KMP算法的基本原理:** 通过预处理模式串的...
- **二叉编码树**:每个叶子节点代表一个字符,并且有一个权值与之对应。 **6.5.2 Huffman树及Huffman编码** - **Huffman树**:通过构建最优二叉树来实现高效的编码方案。 - **Huffman编码**:一种变长编码技术,...