子集和问题 暴力求解算法

子集和问题的一个实例为<S,c>。其中S={x1,x2,…,xn}是一个正整数的集合,c是一个正整数。子集和问题判定是否存在S的一个子集S1,使得S1中所有元素的和为c。

暴力法也称为穷举法、蛮力法,它要求调设计者找出所有可能的方法,然后选择其中的一种方法,若该方法不可行则试探下一种可能的方法。 
暴力法也是一种直接解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。 暴力法不是一个最好的算法,但当我们想不出更好的办法时,它也是一种有效的解决问题的方法。 
暴力法的优点是逻辑清晰,编写程序简洁。在程序设计竞赛时,时间紧张,相对于高效的、巧妙的算法,暴力法编写的程序简单,能更快地解决问题。同时蛮力法也是很多算法的基础,可以在蛮力法的基础上加以优化,得到更高效的算法。 
而且,某些情况下,算法规模不大,使用优化的算法没有必要,而且某些优化算法本身较复杂,在规模不在时可能因为复杂的算法浪费时间,反而不如简单的暴力搜索。 
使用暴力法常用如下几种情况: 

(1)搜索所有的解空间;

 (2)搜索所有的路径; 


(3)直接计算; 

(4)模拟和仿真

#include <stdio.h>
#include <math.h>

int main()
{

	int i,j;
	int n,c;
	int *s;
	int temp,sum;

	scanf("%d%d",&n,&c);
	s=new int [n];

	for(i=0;i<n;i++){
		scanf("%d",&s[i]);
	}

	for(i=0;i<pow(2,n);i++)
	{
		temp=i; sum=0;
		for(j=0;j<n;j++)
		{
			if(temp%2)
				sum+=s[j];
			temp=temp/2;
		}

		if(sum==c)
		{
			temp=i;
			for(j=0;j<n;j++)
			{
				if(temp%2)
				{
					printf("%4d",s[j]);
				}
				temp=temp/2;
			}
			printf("\n");
		}
	}

	return 0;
}
点赞