这段代码与之前发布的01背包问题密切相关。在使用暴力法解决01背包问题的时候,最大的问题在于求出一个数组的所有子集,并在这些子集中搜索出最优解。
也曾经在网上搜索了大家关于求子集的问题的答案,深受启发,所以在这里把代码贴出来,以供后来者参考。代码没有经过太多的优化,可能看起来比较Ugly。
#include <stdio.h>
//k是开始字符的位置,n是数组的长度,l是子集的位数
void subArray(int A[], int k,int l, int n);
//初始化整个子集数组
void initArray(int n);
//用于输出子集的数组
int priArray[4];
void printArray(int n);
int counter = 0;
int main()
{
int i;
int array[4] = {1, 2 , 3, 4};
//0是所有数组的子集
printf("0\n");
counter += 1;
for (i = 0; i < 4; i++)
{
initArray(4);
//递归算法需要保证从第一个元素开始的所有的元素都被遍历到
priArray[0] = array[i];
counter += 1;
printArray(1);
subArray(array, i+1, 2, 4);
}
printf("\nThe SubArray is %d\n", counter);
return 0;
}
/*
* 该递归算法每次只向后寻找一位数字。
* 例如k=1时,只会寻找2,3,4;k=2时,只会寻找3,4
*/
void subArray(int A[], int k, int l, int n)
{
int i;
if (k == n-1)
{
//n是整个数组的长度,k是整个子集的上一位字符,当k == n-1时,意味着已经是最后一个了。
priArray[l-1] = A[k];
counter += 1;
printArray(l);
}
else
{
for ( i= k; i <= n-1; ++i)
{
priArray[l-1] = A[i];
counter += 1;
printArray(l);
subArray(A, i+1, l+1,n);
}
}
}
/*
* 打印子集数组的函数
*/
void printArray(int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("%d ", priArray[i]);
}
printf("\n");
}
void initArray(int n)
{
for (int i = 0; i<= n-1 ; i++) {
priArray[i] = 0;
}
}
分享到:
相关推荐
求整数数组的子集C语言
以上只是C语言子集BNF文法的一部分描述,实际的BNF文法会更加详细,涵盖C语言的所有特性。理解并能运用BNF文法对于深入学习和解析C语言的语法结构非常有帮助。通过BNF,可以构建编译器或解析器,也能用于教学和文档...
在编程领域,子集和数问题是一个经典的算法问题,它要求我们从给定的数集中找出所有可能的子集,使得这些子集的元素之和等于一个特定的目标值。在这个问题中,我们使用C语言来解决,同时标签指出了解决这个问题的一...
在C语言中实现这些步骤,你需要创建结构体来存储模糊集的定义,定义模糊规则的数组,编写模糊化和清晰化的函数,以及模糊推理的算法。C语言的灵活性允许我们自定义数据结构和算法,以适应具体的应用场景。 在压缩包...
以下是一些关于C语言数组的重要知识点: 1. **数组的声明与初始化**:数组可以在声明时被初始化,例如`char array[] = "China";`会创建一个包含6个字符的数组,包括字符串结束符'\0'。数组`array`占用6个字节的内存...
在无向图中,最小生成树是包含所有顶点且权值之和尽可能小的边的子集,这些边形成一棵树,即没有环路。 在C语言中实现克鲁斯卡尔算法,主要步骤包括: 1. **初始化**:创建一个二维数组`s`来表示集合,每个顶点属于...
BNF(巴科斯范式,Backus-Naur Form)是一种形式语法的表示方法,用于描述编程语言的语法规则。...虽然这个子集可能不包括C语言的所有特性,但它涵盖了主要的核心概念,足以处理许多常见的编程任务。
这个特定的程序很可能是一个回溯子集问题的实现,可能涉及到数组、指针、循环和递归等基本C语言特性。通过分析和运行这个程序,初学者可以深入理解回溯算法的工作原理,并提升他们的编程技能。 在实际应用中,理解...
Apriori性质指出,如果一个项集是频繁的,那么它的所有子集也必须是频繁的。这意味着我们可以先查找较小的频繁项集,然后构建更大的候选集,直到找不到新的频繁项集为止。频繁项集是指在数据集中出现次数超过预设...
7. **保存和预测**:将生成的决策树结构保存为C语言的数据结构,如链表或数组,以便于后续的预测操作。 在提供的压缩包中,"ID3算法C源码"可能包含了实现这些步骤的源代码,可能有`.c`和`.h`文件,分别对应C语言的...
要求将A划分成互不相交的子集A1,A2,……Ak,(k≤n),使任何子集中的元素均无冲突关系,同时要求分子集个数尽可能少 例A={1,2,3,4,5,6,7,8,9} R={ (2,8), (9,4), (2,9), (2,1), (2,5), (6,2), (5,9), (5,6), (5,4), (7...
**实验目的:**通过设计并实现一个针对C语言子集的词法分析程序,旨在加深学生对词法分析原理的理解,并掌握如何从源程序中识别并提取出关键字、标识符、常数、运算符和界符号等基础单词符号的方法。 **实验要求:*...
9. **队列**:队列是先进先出(FIFO)的数据结构,C语言中的队列可以用数组或链表实现,适用于任务调度、缓冲区等场景。 10. **整数划分**:这是组合数学的一个问题,寻找一个整数的所有非负整数子集之和等于该整数...
综上所述,最小生成树的Kruskal算法结合并查集是解决图问题的一种有效方法,通过C语言实现可以更好地理解和掌握算法的细节。在实际应用中,可以根据具体需求调整并查集的实现,以满足性能要求。
在C语言中实现模糊PID控制器,可以帮助工程师们在嵌入式系统或者实时操作系统中应用这种高效且适应性强的控制算法。 1. PID控制器基础: PID控制器是最常见的一种过程控制算法,由比例(P)、积分(I)和微分(D)...
《编译原理:C语言文法》 C语言文法是理解编程语言底层运作机制的关键,对于学习编译原理有着至关重要的作用。...深入理解和掌握这些文法规则,对于编写高效、清晰的C代码以及进行编译器设计与实现具有重要意义。
接下来,我们遍历数组中的每个元素,对于每个元素,我们再次遍历它之前的所有元素。如果找到一个比当前元素小的元素,并且以该小元素为结尾的上升子序列长度加一大于当前元素为结尾的上升子序列长度,则更新当前元素...
C语言实现Apriori算法,可以让我们在没有高级编程环境支持的情况下,也能进行有效的数据挖掘操作。 首先,理解Apriori算法的步骤至关重要: 1. **生成项集**:从原始交易数据中提取所有单个项目的集合,形成1阶...
在C语言中,这可能涉及结构体、数组和哈希表等数据结构。同时,我们需要编写算法来处理状态集合的并集、差集和投影操作,以及根据NFA的状态转移矩阵构建DFA的状态转换表。 **NFA到DFA转换的优缺点** 1. **优点**: ...